在Elasticsearch中是否在过滤器上下文之前评估查询上下文?如何确定评估顺序?

时间:2019-11-21 12:47:06

标签: performance elasticsearch

我正在使用以下查询:

GET customer/doc/_search?routing=123
{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "location": "Delhi"
          }
        }
      ],
      "should": [
        {
          "match_phrase_prefix": {
            "phone": {
              "query": "650",
              "max_expansions": 100
            }
          }
        }
      ]
    }
  }
}

问题是我在手机上的搜索不再起作用。当我的数据较少时,它过去可以正常工作,现在每个分片都具有多个位置的数据。现在,在手机上搜索时,我需要输入6或7个字符。 (可能有匹配的电话号码,但位置不同,但在此分片上)

这是由于我猜测的是max_expansions。当我将其增加到500时,它确实会返回搜索结果(不是全部),但是查询变慢。

是否没有办法强制es首先应用过滤器(并限制数据集),然后应用should子句,以便即使max_expansions的值很小,我也可以获得匹配结果?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

这是由于max_expansions。限制数据集并不完全是您想要做的(那也不是很简单-您可能必须使用一些脚本,这反过来会降低查询速度)。

查询通配符表达式时,Lucene会将通配符表达式扩展为倒排索引术语词典中的一组实际术语。现在,当您将词条扩展限制为500时-可能会错过一些。

我会考虑在索引编制阶段使用prefixes。前缀有助于避免在运行时阶段进行昂贵的扩展。