Elasticsearch:仅过滤时,为什么要使用过滤后的查询类型

时间:2019-04-25 01:54:37

标签: elasticsearch

两者之间有什么区别

{
  "query": {
    "filtered": {
    "filter": { "term": { "folder": "inbox" } }
    }
  }
}

{
  "query": {
    "term": { "folder": "inbox" }
  }
}

似乎它们都通过folder值过滤了inbox字段上的索引。

2 个答案:

答案 0 :(得分:1)

查询在弹性搜索中可以具有两种类型的上下文。 Query上下文和filter上下文。查询上下文可以判断文档与查询的匹配程度,即计算分数,而过滤条件可以判断文档是否与查询匹配,并且不计分。

查询上下文中的查询告诉您哪个文档与查询更匹配。分数越高,文档越有意义。

过滤器上下文中的查询的行为类似于条件运算符,即如果文档与查询匹配,则为 true ,否则为 false

要回答您的问题,两个查询都将匹配相同数量的文档,但是第一个查询将不计算分数(由于跳过了分数计算,因此比第二个查询更快),而第二个查询将计算分数并且比第一个要慢。因此,如果您只想过滤,最好告诉Elastic不需要通过将查询放在过滤器上下文中来计算得分。这样,您可以节省计算分数的计算成本。如果仅需要过滤,那么计算分数将是一项开销,因此存在两种类型的上下文。

第一个查询的示例输出(过滤器上下文):

{
  "_index": "test",
  "_type": "_doc",
  "_id": "3",
  "_score": 0,                 <-------- no scoring done
}

第二次查询(查询上下文)的示例输出:

{
  "_index": "test",
  "_type": "_doc",
  "_id": "2",
  "_score": 0.9808292          <-------- score calculated
}

因此,请使用查询上下文获取相关的匹配项,并使用过滤器上下文过滤掉文档。您也可以将两者结合使用。

您可以阅读有关查询和过滤器上下文here的更多信息。

答案 1 :(得分:0)

我同意楼上的说法,但是有一点要补充。 Query Filter 可以在查询中一起使用以减少时间。