我正在使用ElasticSearch构建自动完成功能.当用户输入时,我想显示数据的完成列表,因此用户可以选择一个.例如,如果数据包含以下短语:
very unusual very unlikely very useful
和用户类型:
very u
我想显示上面的短语.
我正在使用此查询:
"query": { "multi_match": { "query": "very u", "fields": [ "name", "description", "contentBlocks.caption", "contentBlocks.text" ], "type": "phrase_prefix", "max_expansions": 10, "cutoff_frequency": 0.001 }
这与我正在寻找的内容相匹配,但从搜索结果中提取匹配的短语非常尴尬.我一直在使用突出显示,我通过解析突出显示来收集匹配的短语.例如:
"highlight": { "contentBlocks.text": [ "turned the very unusual doorknob" ] } "highlight": { "contentBlocks.text": [ "invented a very useful mechanism" ] }
这样做的正确方法是什么?
"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" } } },
我使用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 } } } },
短语建议的文档似乎完全面向"拼写纠正"而不是完成.因为我所完成的是完成,我将直接生成器的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 } ] } } }
搜索"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 } ] } ] }
我期望为输入"sa"找到的是以任何长度的"sa"开头的单词.为什么它只返回两个或三个字符的单词?为什么它只返回六个选项?我一直在使用的multi_match phrase_prefix查询找到了以"sa"开头的更长的单词,例如"save","sassy","safari"和"salad".
当我搜索多字文本的建议时,例如"一个或"(在数据中出现很多次),它什么也没找到.multi_match phrase_prefix查询找到"一个或多个","一个或","一个或你",以及"一个或两个".
我怎样才能让这个建议者做我想做的事情?