【问题标题】:Difference between Query Context and Filter Context while Querying查询时查询上下文和过滤上下文的区别
【发布时间】:2016-11-24 15:25:48
【问题描述】:

Query DSL 中 Elastic Search 中的 Query ContextFilter Context 有什么区别。

我的理解是查询上下文 - 文档与查询参数的匹配程度。

例如:

    { "match": { "title":   "Search"        }}

如果我正在搜索标题为“搜索”的文档,那么如果我包含两个文档

      i)title:"Search"    
      ii)title:"Search 123"

那么第一个文档是完全匹配的,而文档二是半匹配的。然后第一个文档排在第一位,第二个文档排在第二位。我的理解正确吗?

过滤上下文
例如:

{ "term":  { "status": "published" }}

如果我正在搜索状态为“已发布”的文档,那么如果我包含两个文档

      i)status:"published"    
      ii)status:"published 123"

那么第一个文档是完美的所以它被返回,第二个匹配不是完美匹配所以它不被返回。我的理解正确吗?

【问题讨论】:

  • 那我的理解正确吗?
  • 过滤器可用于根据是/否答案选择文档(并且没有评分),而查询主要用于全文搜索(和评分)。主要思想是尽可能过滤文档,以便可以在尽可能少的文档上执行查询。所以你的理解是正确的。
  • 不,您不正确,如果将标准分析器用于状态字段,则第二个文档也匹配。查询上下文和过滤上下文有多重区别,但是从索引的角度来看,分析方面并没有什么不同。这是从查询的角度来看的。如果您搜索已发布和已发布,情况会有所不同。
  • 问题是过滤器用“是”或“否”回答问题。查询告诉你“多少”。过滤器将为您返回分数为 1.0 的结果,此时 Query 将为您提供一些您可以使用 _explain API 进行调试的数字

标签: elasticsearch dsl elasticsearch-query


【解决方案1】:

基本上在查询上下文中,弹性搜索会扫描所有文档并尝试找出文档与查询的匹配程度,这意味着将为每个文档计算分数。在过滤器上下文中,它只会检查文档是否与查询匹配,即只返回是或否。过滤查询不影响文档的得分。

接下来是 match 和 term 查询之间的区别,如果你将一个字段映射到关键字,那么该字段将不会被分析,并且它的倒排索引包含整个术语,即如果状态被映射到关键字 then如果您在状态字段中插入“已发布 123”,则其倒排索引包含 [“已发布 123”] 并且如果状态被映射到文本,则在将数据插入状态字段时对其进行分析:如果您插入“已发布 123”然后它的倒排索引将是 ["published","123"]。 因此,每当您对关键字字段使用术语查询时,都不会分析查询字符串,它会尝试在倒排索引中找到确切的术语,如果您使用匹配查询,它会分析查询字符串并返回包含其中之一的所有文档在它的倒排索引中分析查询字符串

【讨论】:

    【解决方案2】:

    您对术语和匹配查询之间差异的理解在最基本的层面上是正确的,但就像 Jettro 在过滤查询中评论的那样,您提到两个文档都将被选中。在进行术语查询时,它实际上取决于您使用的分析器类型以及它如何影响存储在 lucene 使用的倒排索引中的术语。 引用 Elasticsearch 中的一个示例:Th Definitive Guide “如果您要将 ["Foo","Bar"] 索引到一个精确值 not_analyzed 字段中,或者将 Foo Bar 索引到一个使用空白分析器分析的字段中,两者都会导致倒排索引中的 Foo 和 Bar 这两个词。”

    现在,术语查询将在倒排索引中搜索您的查询术语的所有术语,即使其中一个匹配,它也会作为结果返回。 所以在第一种情况下,倒排索引中只有“已发布”,但在第二种情况下,“已发布”和“123”这两个词也有,因此两个文档都将作为匹配项返回。

    记住术语查询在倒排索引中只查找确切的术语也很重要;它不会将“Published”或“publisheD”等任何变体与“published”匹配。

    【讨论】:

      猜你喜欢
      • 2017-05-06
      • 2017-09-12
      • 1970-01-01
      • 1970-01-01
      • 2017-10-12
      • 2015-05-29
      • 1970-01-01
      • 1970-01-01
      • 2021-09-30
      相关资源
      最近更新 更多