在Elasticsearch中是否先于过滤上下文评估了查询上下文?如何确定评估顺序?

问题描述 投票:0回答:1

我正在使用以下查询:

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的值很小,也可以获得匹配结果?

感谢您的任何帮助。

java performance elasticsearch
1个回答
0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.