如果Elasticsearch中的“过滤器”和“已过滤的查询”之间存在差异,我正在尝试解决。
以下两个示例请求在针对我的索引运行时会返回相同的结果。
它们是否真的以某种微妙的方式不同?
在不同情况下,是否有人会优先选择其他人?
DSL提供一个顶级query
,和一个顶级filter
:
GET /index/type/_search?_source
{
"query": {
"multi_match": {
"query": "my dog has fleas",
"fields": ["name", "keywords"]
}
},
"filter": {
"term": {"status": 2}
}
}
DSL使用query
构造提供仅顶级filtered
:
GET /index/type/_search?_source
{
"query": {
"filtered": {
"query": {
"multi_match": {
"query": "my dog has fleas",
"fields": ["name", "keywords"]
}
},
"filter": {
"term": {"status": 2}
}
}
}
}
答案 0 :(得分:11)
第一个示例是post_filter,从性能角度来看,这是次优的。首选过滤查询,因为过滤器将在查询之前运行。通常,您希望首先运行过滤器,因为评分文档比布尔传递/失败更昂贵。这样,在对其运行查询之前,会减少结果集。使用post_filter,首先运行查询,对整个结果集进行评分,然后将过滤器应用于结果。
顶级filter
指令在1.0中已弃用,并已重命名为post_filter
以阐明其用途和用法。
搜索中的顶级过滤器参数已重命名为post_filter,表示不应将其用作过滤搜索结果的主要方式(改为使用过滤后的查询),而只是过滤结果/结点后的结果已经计算好了。
http://www.elastic.co/guide/en/elasticsearch/reference/current/_search_requests.html