Dav*_*son 6 autocomplete elasticsearch
我正在使用ElasticSearch构建自动完成功能.当用户输入时,我想显示数据的完成列表,因此用户可以选择一个.例如,如果数据包含以下短语:
very unusual
very unlikely
very useful
Run Code Online (Sandbox Code Playgroud)
和用户类型:
very u
Run Code Online (Sandbox Code Playgroud)
我想显示上面的短语.
我正在使用此查询:
"query": {
"multi_match": {
"query": "very u",
"fields": [
"name",
"description",
"contentBlocks.caption",
"contentBlocks.text"
],
"type": "phrase_prefix",
"max_expansions": 10,
"cutoff_frequency": 0.001
}
Run Code Online (Sandbox Code Playgroud)
这与我正在寻找的内容相匹配,但从搜索结果中提取匹配的短语非常尴尬.我一直在使用突出显示,我通过解析突出显示来收集匹配的短语.例如:
"highlight": {
"contentBlocks.text": [
"turned the <em>very</em> <em>unusual</em> doorknob"
]
}
"highlight": {
"contentBlocks.text": [
"invented a <em>very</em> <em>useful</em> mechanism"
]
}
Run Code Online (Sandbox Code Playgroud)
这样做的正确方法是什么?
"Phrase Suggester"可能能够完成我所描述的内容,但你怎么做到这一点并不明显.
我已将感兴趣的字段(例如"描述")编入索引,如下所示:
"description" : {
"index_analyzer" : "snowball_stem",
"search_analyzer" : "snowball_stem",
"type" : "string",
"fields" : {
"autocomplete" : {
"index_analyzer" : "shingle_analyzer",
"search_analyzer" : "shingle_analyzer",
"type" : "string"
}
}
},
Run Code Online (Sandbox Code Playgroud)
我使用snowball_stem分析器进行搜索,使用shingle_analyzer进行自动完成功能.shingle_analyzer看起来像这样:
"settings" : {
"analysis" : {
"analyzer" : {
"shingle_analyzer" : {
"type" : "custom",
"tokenizer" : "standard",
"filter" : [
"standard",
"lowercase",
"shingle_filter"
],
"char_filter" : [
"html_strip"
]
}
},
"filter" : {
"shingle_filter" : {
"type" : "shingle",
"min_shingle_size" : 2,
"max_shingle_size" : 2
}
}
}
},
Run Code Online (Sandbox Code Playgroud)
短语建议的文档似乎完全面向"拼写纠正"而不是完成.因为我所完成的是完成,我将直接生成器的min_word_length和prefix_length设置为输入文本的长度,在本例中为2.
我根据文档制作了一个建议查询:
{
"text" : "sa",
"autocomplete_description" : {
"phrase" : {
"analyzer" : "standard",
"field" : "description.autocomplete",
"size" : 10,
"max_errors" : 2,
"confidence" : 0.0,
"gram_size" : 2,
"direct_generator" : [
{
"field" : "description.autocomplete",
"suggest_mode" : "always",
"size" : 10,
"min_word_length" : 2,
"prefix_length" : 2
}
]
}
}
}
Run Code Online (Sandbox Code Playgroud)
搜索"sa"的建议会产生以下结果:
{
"_shards" : {
"total" : 1,
"successful" : 1,
"failed" : 0
},
"autocomplete_description" : [ {
"text" : "sa",
"offset" : 0,
"length" : 2,
"options" : [ {
"text" : "say",
"score" : 0.012580795
}, {
"text" : "sa",
"score" : 0.01127677
}, {
"text" : "san",
"score" : 0.0106529845
}, {
"text" : "sad",
"score" : 0.008533429
}, {
"text" : "saw",
"score" : 0.008107899
}, {
"text" : "sam",
"score" : 0.007155634
} ]
} ]
}
Run Code Online (Sandbox Code Playgroud)
我期望为输入"sa"找到的是以任何长度的"sa"开头的单词.为什么它只返回两个或三个字符的单词?为什么它只返回六个选项?我一直在使用的multi_match phrase_prefix查询找到了以"sa"开头的更长的单词,例如"save","sassy","safari"和"salad".
当我搜索多字文本的建议时,例如"一个或"(在数据中出现很多次),它什么也没找到.multi_match phrase_prefix查询找到"一个或多个","一个或","一个或你",以及"一个或两个".
我怎样才能让这个建议者做我想做的事情?
您可以通过完成建议器大致得到您想要的内容。这样做的主要问题是它不再具有搜索意识。您可以通过添加建议上下文来解决此问题,但它仅适用于过滤器,并且不考虑搜索文本。
据我所知,获得“最佳”行为(上下文感知搜索完成)的唯一方法是执行以下操作:
suggestions字段,其中文本被标记化,因为您希望用户看到它(可能是标准分析器,或者可能添加 2-shingle 标记过滤器)。very un。在幕后发出搜索very,然后使用术语聚合来获取与搜索上下文匹配的列表术语,但限制使用 . 返回的术语"include": "un.*"。此方法的唯一问题(尤其是在分片环境中)是,需要进行大量查询,并且需要将非常高的基数字段 ( suggestions) 拉入内存。所以...我不知道这实际上是否可行。所以也许最好还是返回完成建议器。如果您尝试其中任何一个,我有兴趣听听您的体验。