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

Shi*_*vam 5 apache lucene elasticsearch

我对 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"
         }                                   
       }
     }
   }
 }'
Run Code Online (Sandbox Code Playgroud)

第二个查询:-

 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"
         }                                   
       }
     }
   }
 }'
Run Code Online (Sandbox Code Playgroud)

谢谢,

Ant*_*Val 4

官方指南里有很好的解释:

\n\n
\n

查询上下文

\n\n

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

\n\n

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

\n\n

过滤上下文

\n\n

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

\n\n

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

\n\n

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

\n
\n\n

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

\n\n

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

\n