【问题标题】:Elasticsearch query context vs filter contextElasticsearch 查询上下文与过滤上下文
【发布时间】:2017-05-06 05:04:18
【问题描述】:

我对 ElasticSearch Query DSL 的查询上下文和过滤上下文有点困惑。我有以下 2 个查询。两个查询都返回相同的结果,第一个评估分数,第二个不评估。哪个更合适?

第一个查询:-

 curl -XGET 'localhost:9200/xxx/yyy/_search?pretty' -d'
 {
   "query": {
     "bool": {
       "must": {
         "terms": { "mcc" : ["5045","5499"]}
       },
       "must_not":{
         "term":{"maximum_flag":false}
       },                          
       "filter": {
         "geo_distance": {
           "distance": "500",
           "location": "40.959334, 29.082142"
         }                                   
       }
     }
   }
 }'

第二次查询:-

 curl -XGET 'localhost:9200/xxx/yyy/_search?pretty' -d'
 {
   "query": {
     "bool" : {
       "filter": [
         {"term":{"maximum_flag":true}},
         {"terms": { "mcc" : ["5045","5499"]}}
       ],
       "filter": {
         "geo_distance": {
            "distance": "500",
            "location": "40.959334, 29.082142"
         }                                   
       }
     }
   }
 }'

谢谢,

【问题讨论】:

  • 这个SO 可能会有所帮助!

标签: apache elasticsearch lucene


【解决方案1】:

在官方指南中你有一个很好的解释:

查询上下文

查询上下文中使用的查询子句回答了“该文档与该查询子句的匹配程度如何?”这个问题。除了决定文档是否匹配之外,查询子句还计算一个 _score,表示文档相对于其他文档的匹配程度。

只要将查询子句传递给查询参数(例如搜索 API 中的查询参数),查询上下文就会生效。

过滤上下文

在过滤器上下文中,查询子句回答“此文档是否匹配此查询子句?”的问题。答案很简单,是或否 — 不计算分数。过滤上下文主要用于过滤结构化数据,例如

此时间戳是否属于 2015 到 2016 年的范围? 状态字段是否设置为“已发布”? Elasticsearch 会自动缓存常用的过滤器,以提高性能。

只要将查询子句传递给过滤器参数(例如 bool 查询中的 filter 或 must_not 参数、constant_score 查询中的过滤器参数或过滤器聚合),过滤器上下文就会生效。

https://www.elastic.co/guide/en/elasticsearch/reference/2.3/query-filter-context.html

关于您的情况,我们需要更多信息,但考虑到您正在寻找准确的值,过滤器会更适合它。

【讨论】:

    【解决方案2】:

    第一个查询是评估分数,因为您在此处直接使用“术语”而不将其包装在“过滤器”中,因此默认情况下,直接在查询中写入的“术语”以查询上下文格式运行,从而计算分数。 但是在第二个查询的情况下,您在“过滤器”中使用“术语”,它将其上下文从 Query Context 更改为 filter Context 。在过滤器的情况下,不计算分数(默认情况下,_score 1 分配给所有匹配的文档)。 您可以在本文中找到有关查询行为的更多详细信息 https://towardsdatascience.com/deep-dive-into-querying-elasticsearch-filter-vs-query-full-text-search-b861b06bd4c0

    【讨论】:

      猜你喜欢
      • 2016-11-24
      • 2017-09-12
      • 2018-05-10
      • 2017-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-12
      相关资源
      最近更新 更多