【问题标题】:Elastic search bool query with filter is slower than query without filter带过滤器的弹性搜索布尔查询比不带过滤器的查询慢
【发布时间】:2018-03-19 21:18:13
【问题描述】:

我使用 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.454、1.316

我希望带有过滤器的查询提供更好的性能,因为它不需要计算分数,并且可以缓存。 Elastic 还建议在布尔查询中使用过滤器。

【问题讨论】:

  • 尝试这样做:"filter": [ {"terms":{"puid":["user1"]}}, {"terms":{"fid":["user1 -1519812713"]}} ]
  • 谢谢。我试了一下。时间成本差不多:1.339 1.462 1.327
  • 我在下面添加了一个答案。检查配置文件 api 了解更多信息。对于本地主机中的简单查询,结果和数据很少,那么您不能指望这些结果会向您展示真实情况,用于端到端基准测试,但您可以检查内部结构(配置文件 api)并查看发生在那里。即使您的请求的反序列化也会严重影响结果

标签: elasticsearch search filter


【解决方案1】:

首先,您正在对第二个进行不同的查询。 第一次使用terms,第二次使用termterms。尽管这不应该是重要的事情,但您可以使用完全相同的查询作为基准。

此外,您的过滤器查询正在使用我认为导致问题的内部 bool 查询。试试改成这个

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

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

【讨论】:

  • 非常感谢。我按照您的建议进行了更改,将术语更改为术语,这显示了相同的性能。使用配置文件 API,我发现大部分时间差异来自用于标题和正文搜索的 build_scorer:“build_scorer”:935800708 与“build_scorer”:694623520 用于“header:*hello*”术语查询,“build_scorer”:314067234 与“build_scorer” : 214277109 用于 "body:*hello*" 术语查询。那是 0.3 秒,这很重要。
  • @Happy 如果它解决了您的问题,请不要忘记标记答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-07
  • 2019-07-26
  • 2015-01-25
  • 1970-01-01
  • 2019-12-17
  • 2016-08-28
相关资源
最近更新 更多