使用过滤器的弹性搜索bool查询比没有过滤器

时间:2018-03-19 21:18:13

标签: elasticsearch search filter

我使用easlticsearch 6.

使用过滤器查询:

"query":{
    "bool":{
        "must":[{
            "bool":{
                "minimum_should_match":1,
                "should":[
                    {"wildcard":{"header":"*hello*"}},
                    {"wildcard":{"body":"*hello*"}}
                 ]
            }
        }],
        "filter":[{
            "bool":{
                "must":[
                    {"terms":{"puid":["user1"]}},
                    {"terms":{"fid":["user1-1519812713"]}}
                ]
            }
        }]
    }
}

不带过滤器的查询:

"query":{
    "bool":{
        "must":[
            {"term":{"puid":"user1"}},
            {"terms":{"fid":["user1-1519812713"]}},
            "bool":{
                 "minimum_should_match":1,
                 "should":[
                     {"wildcard":{"header":"*hello*"}},
                     {"wildcard":{"body":"*hello*"}}
                 ]
            }}
        ]
    }
}

当我使用curl测量两个查询的性能时: curl -w'\ ntime_total:%{time_total} \ n'-H'Content-Type:application / json'-XGET -d'{}':9200 / store / msg / _search?routing = user1

我获得查询的总时间 没有过滤器:1.134,1.237,1.107 带过滤器:1.322,1.445,1.316

我希望带有过滤器的查询提供更好的性能,因为它不需要计算得分,而且可以缓存。 Elastic还建议在bool查询中进行过滤。

1 个答案:

答案 0 :(得分:0)

首先,您在第二个查询上执行不同的查询。 在您用于terms的第一个中,在第二个中您使用了一个term和一个terms。虽然这不应该具有重要意义,但您可以使用与基准测试完全相同的查询。

此外,您的过滤器查询使用了我认为导致问题的内部bool查询。尝试将其更改为

"filter": [
  {"terms":{"puid":["user1"]}},
  {"terms":{"fid":["user1-1519812713"]}}
]

此外,您可以查看Profile API以了解有关查询的更多详细信息