我正在使用ElasticSearch構建自動完成功能。當用戶鍵入時,我想顯示數據中的完成列表,以便用戶選擇一個。例如,如果數據包含以下短語: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 <em>very</em> <em>unusual</em> doorknob"
]
}
"highlight": {
"contentBlocks.text": [
"invented a <em>very</em> <em>useful</em> mechanism"
]
}
什麼是正確的方法來做到這一點?
「短語提示」可能能夠完成我所描述的內容,但是如何才能做到這一點並不明顯。
我已經索引感興趣的領域(例如,「說明」)如下:
"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」。
當我搜索多詞文本的建議時,如「one or」(在數據中出現很多次),它什麼也找不到。 multi_match phrase_prefix查詢找到「一個或多個」,「一個或者」,「一個或者你」和「一個或者兩個」。
我怎樣才能讓這個建議者做我想做的事?
如果您有任何問題,請告訴我,或者我可以在我的答案中添加任何內容。 –
我來看看。 –
我嘗試過使用短語提示器來做到這一點,但我沒有取得太大的成功。我在上面的問題描述中添加了關於我的實驗的信息和更詳細的問題。 –