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)
没有返回结果。这里会发生什么?
我将假设您正在使用Elasticsearch 5.0及更高版本。我认为可能是由于max_expansions默认值所致。
如文档中看到这里时,max_expansions参数用于控制多少前缀的最后一项将被扩大。默认值为50,它可以解释为什么找到带有两个首字母B和L而不是仅包含B的“黑色”和“蓝色”的原因。
该文档对此非常清楚:
match_phrase_prefix查询是穷人的自动完成功能。它非常易于使用,它使您可以快速开始键入搜索,但其结果通常足够好,有时会造成混淆。
考虑查询字符串快速棕色f。该查询的工作原理是通过快速和棕色创建短语查询(即,必须存在术语“快速”并且必须紧随其后的是“棕色”)。然后,它查看排序的术语词典,以找到以f开头的前50个术语,并将这些术语添加到短语查询中。
问题在于前50个术语可能不包含术语fox,因此将找不到相速棕色狐狸。这通常不是问题,因为用户将继续输入更多字母,直到他们要查找的单词出现为止
如果您要寻找良好的性能,我将无法告诉您是否可以将此参数增加到50以上,因为我从未尝试过。
归档时间: |
|
查看次数: |
3900 次 |
最近记录: |