Elasticsearch匹配短语前缀不匹配所有术语

Pau*_*ies 1 querying match missing-data elasticsearch

我遇到一个问题,当我在Elasticsearch中使用match_phrase_prefix查询时,它没有返回我期望的所有结果,尤其是当查询是一个单词后跟一个字母时。

进行以下索引映射(这是保护敏感数据的人为示例):

http://localhost:9200/test/drinks/_mapping
Run Code Online (Sandbox Code Playgroud)

返回:

{
  "test": {
    "mappings": {
      "drinks": {
        "properties": {
          "name": {
            "type": "text"
          }
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

在数百万其他记录中,还有:

{
    "_index": "test",
    "_type": "drinks",
    "_id": "2",
    "_score": 1,
    "_source": {
        "name": "Johnnie Walker Black Label"
    }
},
{
    "_index": "test",
    "_type": "drinks",
    "_id": "1",
    "_score": 1,
    "_source": {
        "name": "Johnnie Walker Blue Label"
    }
}
Run Code Online (Sandbox Code Playgroud)

以下查询,是一个单词,后跟两个字母:

POST http://localhost:9200/test/drinks/_search
{
    "query": {
        "match_phrase_prefix" : {
            "name" : "Walker Bl"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

返回此:

{
    "took": 1,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "failed": 0
    },
    "hits": {
        "total": 2,
        "max_score": 0.5753642,
        "hits": [
            {
                "_index": "test",
                "_type": "drinks",
                "_id": "2",
                "_score": 0.5753642,
                "_source": {
                    "name": "Johnnie Walker Black Label"
                }
           },
           {
               "_index": "test",
               "_type": "drinks",
               "_id": "1",
               "_score": 0.5753642,
               "_source": {
                   "name": "Johnnie Walker Blue Label"
                }
            }
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

而此查询只有一个单词和一个字母:

POST http://localhost:9200/test/drinks/_search
{
    "query": {
        "match_phrase_prefix" : {
            "name" : "Walker B"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

没有返回结果。这里会发生什么?

Rla*_*que 6

我将假设您正在使用Elasticsearch 5.0及更高版本。我认为可能是由于max_expansions默认值所致。

如文档中看到这里时,max_expansions参数用于控制多少前缀的最后一项将被扩大。默认值为50,它可以解释为什么找到带有两个首字母B和L而不是仅包含B的“黑色”和“蓝色”的原因。

该文档对此非常清楚:

match_phrase_prefix查询是穷人的自动完成功能。它非常易于使用,它使您可以快速开始键入搜索,但其结果通常足够好,有时会造成混淆。

考虑查询字符串快速棕色f。该查询的工作原理是通过快速和棕色创建短语查询(即,必须存在术语“快速”并且必须紧随其后的是“棕色”)。然后,它查看排序的术语词典,以找到以f开头的前50个术语,并将这些术语添加到短语查询中。

问题在于前50个术语可能不包含术语fox,因此将找不到相速棕色狐狸。这通常不是问题,因为用户将继续输入更多字母,直到他们要查找的单词出现为止

如果您要寻找良好的性能,我将无法告诉您是否可以将此参数增加到50以上,因为我从未尝试过。