我对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"
}
}
}
}
}'
谢谢,
答案 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
关于您的情况,我们需要更多信息,但考虑到您正在寻找准确的值,过滤器会更好地适应它。