1

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"

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

4

2 回答 2

4

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

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

于 2018-10-03T11:33:49.593 回答
0

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

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

同样重要的是要记住,术语查询仅在倒排索引中查找确切的术语。它不会将“已发布”或“已发布”等任何变体与“已发布”匹配。

于 2016-07-22T10:18:36.510 回答