[ElasticSearch]Suggest查询建议(自动补全纠错)
1) 概念
查詢(xún)建議,能夠?yàn)橛脩?hù)提供良好的使用體驗(yàn)。主要包括:
?? ?拼寫(xiě)檢查(糾錯(cuò))
?? ?自動(dòng)建議查詢(xún)?cè)~(自動(dòng)補(bǔ)全)
2) Suggest種類(lèi)及參數(shù)
2.1 Term Suggester
Term Suggester: 對(duì)給入的文本進(jìn)行分詞,為每個(gè)詞進(jìn)行模糊查詢(xún)提供詞項(xiàng)建議。(建議對(duì)搜索詞進(jìn)行長(zhǎng)度控制,超過(guò)長(zhǎng)度則不會(huì)進(jìn)行TermSuggest,原因也是一般Term Suggester適用于單個(gè)詞使用 把得分最高的推薦詞進(jìn)行返回代表糾錯(cuò))
| text | 建議文本,即要進(jìn)行推薦建議的文本(推薦控制長(zhǎng)度 使用單個(gè)詞進(jìn)行搜索推薦)。 |
| field | 從哪個(gè)字段中獲取建議結(jié)果,智搜詞庫(kù)中指定的keyword字段 |
| analyzer | 分析器 |
| size | 建議返回的更正詞的最大數(shù)量。 |
| sort | 排序方式 1.score(默認(rèn)):首先是按分?jǐn)?shù)進(jìn)行排序,分?jǐn)?shù)相同按詞頻(freq)進(jìn)行排序 2.frequency: 首先按詞頻進(jìn)行排序,然后按分?jǐn)?shù)進(jìn)行排序 |
| suggest_mode | 建議模式控制 1.missing(默認(rèn)): 搜索的詞如果本身就存在詞庫(kù)中,則不進(jìn)行推薦搜索 2.popular:推薦詞的詞頻大于搜索的詞的時(shí)候才會(huì)推薦出來(lái) 3.always:根據(jù)建議文本中的術(shù)語(yǔ)提出任何匹配的建議。 |
| max_edits | 允許推薦的詞的最大編輯距離 默認(rèn)為2 |
| prefix_length | 必須滿足搜索詞的前端的多少個(gè)字符 |
| max_term_freq | 搜索詞可以出現(xiàn)在文檔中的最大閾值(一般設(shè)置為百分比如0.4) 用于過(guò)濾高頻詞 |
| min_doc_freq | 最少出現(xiàn)在多少個(gè)文檔中 |
| string_distance | 指定算法進(jìn)行推薦計(jì)算 1.internal: 默認(rèn)基于 damerau_levenshtein,但高度優(yōu)化用于比較索引內(nèi)術(shù)語(yǔ)的字符串距離 2.damerau_levenshtein 3.levenshtein 4.jaro_winkler 5. ngram |
2.2 Phrase Suggester
Phrase Suggester:在term的基礎(chǔ)上,會(huì)考量多個(gè)term之間的關(guān)系,比如是否同時(shí)出現(xiàn)在索引的原文里,相鄰程度,以及詞頻等。
如果說(shuō)term suggester建議處理單個(gè)詞的糾錯(cuò) 那么Phrase Suggester就建議作為一整句話的糾錯(cuò)(返回值的suggest列表中返回的也是一整句話)
| max_errors | 該句子中拼寫(xiě)錯(cuò)誤的術(shù)語(yǔ)的最大百分比 如果給定[0,1)的浮點(diǎn)數(shù)則為百分比!! 如果>1 則為可拼寫(xiě)錯(cuò)誤詞的個(gè)數(shù)!! |
| separator | 短語(yǔ)中各個(gè)術(shù)語(yǔ)的分隔符 默認(rèn)為空格 可以手動(dòng)指定 |
| highlight | 可以指定高亮 |
2.3?Completion Suggester
Completion Suggester:自動(dòng)補(bǔ)全的建議器,此場(chǎng)景下用戶(hù)每輸入一個(gè)字符的時(shí)候,就需要即時(shí)發(fā)送一次查詢(xún)請(qǐng)求到后端查找匹配項(xiàng),在用戶(hù)輸入速度較高的情況下對(duì)后端響應(yīng)速度要求比較苛刻。因此實(shí)現(xiàn)上它和前面兩個(gè)Suggester采用了不同的數(shù)據(jù)結(jié)構(gòu)。為了使用Completion Suggester,字段的類(lèi)型需要專(zhuān)門(mén)定義如下(當(dāng)然可以通過(guò)fields來(lái)指定):
?這里比較有意思的一點(diǎn)是:completion并非使用倒排索引,而是將analyze過(guò)的數(shù)據(jù)編碼成FST和索引一起存放。也就是直接編碼放入內(nèi)存,這樣會(huì)導(dǎo)致他是連續(xù)的(非倒排的連續(xù)索引),這樣就可以保證自動(dòng)補(bǔ)全(利用前綴)的查詢(xún)速度極快,但是由于他不是倒排索引僅僅只能用于前綴搜索了
接下來(lái)我們put數(shù)據(jù)進(jìn)行測(cè)試
利用completion suggester進(jìn)行查找
得到結(jié)果應(yīng)該為 Elastic is the company behind...那一條
但是此處如果我們更換analyzer為English
此時(shí)我們?cè)诖瞬迦氩⑺阉?elastic i 將搜索不到,這是因?yàn)?我們前面提過(guò)了 它是通過(guò)分詞器進(jìn)行分詞 并且把連續(xù)的詞放入內(nèi)存中以便快速搜索,但是english analyzer會(huì)剝離高頻詞 比如is 所以我們輸入 elastic i的時(shí)候 輸入被分解成"elastic"和"i",FST沒(méi)有編碼這個(gè)“i” , 匹配失敗。
但是如果查詢(xún) elastic is 則會(huì)查詢(xún)到 因?yàn)?#xff1a;經(jīng)過(guò)english analyzer的時(shí)候is也被剝離了,只需在FST里查詢(xún)"elastic"這個(gè)前綴,自然就可以匹配到了。
2.4 參數(shù)
?刨析參數(shù)之前,值得一提的是:它不僅僅包含前綴查詢(xún) 還包含以下幾種
* prefix前綴:一般就是用于搜索推薦自動(dòng)補(bǔ)全的 最常用
* fuzzy模糊: 對(duì)輸入的詞進(jìn)行模糊查詢(xún)并自動(dòng)補(bǔ)全
* Regex正則:滿足正則表達(dá)式的搜索....
| field | 推薦結(jié)果選取字段 |
| size | 最大返回推薦數(shù)量 |
| skip_duplicates | 是否去重(默認(rèn)false) |
| fuzziness | 模糊音字 參考上方的Fuzzy Query中的詳解 |
| transpositions | 是否允許術(shù)語(yǔ)之間的位置交換,默認(rèn)為ture |
| min_length | 輸入的最小長(zhǎng)度 默認(rèn)為3 |
| prefix_length | 前多少個(gè)字符必須完全滿足 |
3) 查詢(xún)語(yǔ)句及返回結(jié)果解析
# 通用格式 {"suggest" : {"my-suggestion" : { #一個(gè)查詢(xún)建議名稱(chēng)"text" : "tring out Elasticsearch", #查詢(xún)文本"term" : { #種類(lèi) 可以替換為phrase(phrase suggester)/prefix(complite suggester)/fuzzy....."field" : "message" #指定在哪個(gè)字段上獲取建議詞}}} } # term { "suggest": {"my-suggestion": {"text": "lucne rock","term": {"suggest_mode": "missing","field": "body"}}} } # Phrase {"suggest": {"my-suggestion": {"text": "lucne and elasticsear rock","phrase": {"field": "body","highlight": {"pre_tag": "<em>","post_tag": "</em>"}}}} } # completion POST blogs_completion/_search?pretty { "size": 0,"suggest": {"blog-suggest": {"prefix": "elastic i","completion": {"field": "body"}}} }# 返回結(jié)果格式及解析 # 需要注意term suggester返回的結(jié)果為術(shù)語(yǔ),而phrase返回的為一段話# term返回結(jié)果解析 # 可以看到在options中返回結(jié)果集,text即為推薦的結(jié)果 score即為得分 frep為推薦詞出現(xiàn)的詞頻 {"suggest":{"my_suggest1":[{"text":"curr","offset":0,"length":4,"options":[{"text":"curry","score":0.75,"freq":6},{"text":"court","score":0.5,"freq":1}]}]} }# phrase返回結(jié)果解析 # 可以看到根據(jù)我們的文本進(jìn)行短語(yǔ)的模糊搜索并給出一整句話!!這是需要注意的和term的區(qū)別 {"suggest":{"my_suggest1":[{"text":"curr is good","offset":0,"length":12,"options":[{"text":"curry is good","score":0.007225802},{"text":"court is good","score":0.0033184804}]}]} }4) Java SDK
SearchRequest request = new SearchRequest("test_index");SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();// 內(nèi)層的term以及參數(shù) ?還有text給定TermSuggestionBuilder termSug = SuggestBuilders.termSuggestion("content").text("查詢(xún)文本").suggestMode(TermSuggestionBuilder.SuggestMode.ALWAYS).size(10);// 外層suggestSuggestBuilder suggestBuilder = new SuggestBuilder();suggestBuilder.addSuggestion("my_suggest", termSug);// 給入suggest到整個(gè)查詢(xún)中searchSourceBuilder.suggest(suggestBuilder);request.source(searchSourceBuilder);總結(jié)
以上是生活随笔為你收集整理的[ElasticSearch]Suggest查询建议(自动补全纠错)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Xilinx FPGA通过FLASH加载
- 下一篇: php将敏感词替换为*的方法