查询

时间:2016-07-21 07:13:40

标签: elasticsearch dsl elasticsearch-query

查询DSL中的弹性搜索中查询上下文过滤上下文之间有什么区别。

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

前:

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

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

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

然后第一个文件是完美匹配,文档二是半匹配。然后,第一个文档首先给出,第二个文档给出第二个文档。我的理解是否正确?

过滤背景
例如:

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

您对术语和匹配查询之间的区别的理解在最基本的级别是正确的,但是在您提到的过滤器查询中注释的Jettro中,两个文档都将被选中。在进行术语查询时,它实际上取决于您使用的是哪种分析器以及它如何影响lucene使用的倒排索引中存储的术语。 引用Elasticsearch:Th Definitive Guide中的一个例子“如果你要将[”Foo“,”Bar“]索引到精确值not_analyzed字段,或者将Foo Bar引入带有空白分析器的分析字段,两者都会导致倒排索引中的两个术语Foo和Bar。“

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

重要的是要记住,术语查询仅在反向索引中查找确切的术语;它不会匹配任何变体,如“已发布”或“publisheD”与“已发布”。