Elasticsearch查询上下文与过滤器上下文

时间:2016-12-20 21:25:23

标签: apache elasticsearch lucene

我对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"
         }                                   
       }
     }
   }
 }'

谢谢,

1 个答案:

答案 0 :(得分:1)

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

  

查询背景

     

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

     

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

     

过滤背景

     

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

     

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

     

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

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

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