首页 文章

Elasticsearch已过滤查询与过滤器[重复]

提问于
浏览
42

这个问题在这里已有答案:

“查询和筛选过滤”和“查询和过滤根”之间有什么区别吗?例如

情况1:

{
  "query":{
    "filtered":{
      "query":{
        "term":{"title":"kitchen3"}
      },
      "filter":{
        "term":{"price":1000}
      }
    }
  }
}

案例2:

{
  "query":{
    "term":{"title":"kitchen3"}
  },
  "filter":{
    "term":{"price":1000}
  }
}

我发现这个讨论http://elasticsearch-users.115913.n3.nabble.com/Filtered-query-vs-using-filter-outside-td3960119.html,但引用的URL是404,对我来说解释有点过于简洁 .

请教导或给出任何指出这些之间差异的文件,谢谢 .

2 回答

  • 34

    差异与绩效有关 . "filter"在顶层始终执行 after 查询 . 这意味着对所有文档执行查询,计算所有文档的分数等 - 并且仅排除不匹配过滤器的文档 .

    通过“过滤”查询,ES有可能优化该计算,例如,首先执行过滤器,然后对有限的文档集执行查询,节省测试与查询不匹配的文档的时间,以及如果它们与查询匹配则计算得分 .

    如果使用相同的过滤器执行多个查询,则还有更多优点:可以缓存过滤器,从而进一步提高每个查询的性能 . 这适用于您的示例:默认情况下会缓存“term”过滤器 .

    您还可以显式控制“已过滤”查询的执行(请参阅文档),以针对您的特定用例对其进行优化 .

  • 8

    两种类型的过滤器也可称为前置和后置过滤器 . 正如@alexey所解释的那样,在查询之后执行根级别过滤器,并在查询之前执行过滤查询中的过滤 .

    此外,您需要了解相同的其他影响,然后执行它们的顺序 . “已过滤”查询中的过滤器位于查询范围内,这意味着在计算聚合时,将考虑过滤后的输出,而在根级别过滤器聚合的情况下,仅对不包括过滤器的查询结果执行 . 虽然在这两种情况下结果文件都是相同的 .

    例如,对于您发布的两个查询,两者都会给出相同的结果,但如果您正在执行聚合,则第一个查询将计算与 Headers kitchen3和price 10000匹配的文档的聚合计数,而第二个查询将计算匹配 Headers 的文档的聚合计数kitchen3只有没有价格1000的过滤器 .

相关问题