日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[ElasticSearch]Suggest查询建议(自动补全纠错)

發布時間:2024/3/26 编程问答 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [ElasticSearch]Suggest查询建议(自动补全纠错) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1) 概念

查詢建議,能夠為用戶提供良好的使用體驗。主要包括:
?? ?拼寫檢查(糾錯)
?? ?自動建議查詢詞(自動補全)

2) Suggest種類及參數

2.1 Term Suggester

Term Suggester: 對給入的文本進行分詞,為每個詞進行模糊查詢提供詞項建議。(建議對搜索詞進行長度控制,超過長度則不會進行TermSuggest,原因也是一般Term Suggester適用于單個詞使用 把得分最高的推薦詞進行返回代表糾錯)

參數描述
text建議文本,即要進行推薦建議的文本(推薦控制長度 使用單個詞進行搜索推薦)。
field從哪個字段中獲取建議結果,智搜詞庫中指定的keyword字段
analyzer分析器
size建議返回的更正詞的最大數量。
sort排序方式 1.score(默認):首先是按分數進行排序,分數相同按詞頻(freq)進行排序 2.frequency: 首先按詞頻進行排序,然后按分數進行排序
suggest_mode建議模式控制 1.missing(默認): 搜索的詞如果本身就存在詞庫中,則不進行推薦搜索 2.popular:推薦詞的詞頻大于搜索的詞的時候才會推薦出來 3.always:根據建議文本中的術語提出任何匹配的建議。
max_edits允許推薦的詞的最大編輯距離 默認為2
prefix_length必須滿足搜索詞的前端的多少個字符
max_term_freq搜索詞可以出現在文檔中的最大閾值(一般設置為百分比如0.4) 用于過濾高頻詞
min_doc_freq最少出現在多少個文檔中
string_distance指定算法進行推薦計算 1.internal: 默認基于 damerau_levenshtein,但高度優化用于比較索引內術語的字符串距離 2.damerau_levenshtein 3.levenshtein 4.jaro_winkler 5. ngram

2.2 Phrase Suggester

Phrase Suggester:在term的基礎上,會考量多個term之間的關系,比如是否同時出現在索引的原文里,相鄰程度,以及詞頻等。

如果說term suggester建議處理單個詞的糾錯 那么Phrase Suggester就建議作為一整句話的糾錯(返回值的suggest列表中返回的也是一整句話)

參數描述
max_errors該句子中拼寫錯誤的術語的最大百分比 如果給定[0,1)的浮點數則為百分比!! 如果>1 則為可拼寫錯誤詞的個數!!
separator短語中各個術語的分隔符 默認為空格 可以手動指定
highlight可以指定高亮

2.3?Completion Suggester

Completion Suggester:自動補全的建議器,此場景下用戶每輸入一個字符的時候,就需要即時發送一次查詢請求到后端查找匹配項,在用戶輸入速度較高的情況下對后端響應速度要求比較苛刻。因此實現上它和前面兩個Suggester采用了不同的數據結構。為了使用Completion Suggester,字段的類型需要專門定義如下(當然可以通過fields來指定):

?這里比較有意思的一點是:completion并非使用倒排索引,而是將analyze過的數據編碼成FST和索引一起存放。也就是直接編碼放入內存,這樣會導致他是連續的(非倒排的連續索引),這樣就可以保證自動補全(利用前綴)的查詢速度極快,但是由于他不是倒排索引僅僅只能用于前綴搜索了

接下來我們put數據進行測試

利用completion suggester進行查找

得到結果應該為 Elastic is the company behind...那一條

但是此處如果我們更換analyzer為English

此時我們在此插入并搜索 elastic i 將搜索不到,這是因為 我們前面提過了 它是通過分詞器進行分詞 并且把連續的詞放入內存中以便快速搜索,但是english analyzer會剝離高頻詞 比如is 所以我們輸入 elastic i的時候 輸入被分解成"elastic"和"i",FST沒有編碼這個“i” , 匹配失敗。

但是如果查詢 elastic is 則會查詢到 因為:經過english analyzer的時候is也被剝離了,只需在FST里查詢"elastic"這個前綴,自然就可以匹配到了。

2.4 參數

?刨析參數之前,值得一提的是:它不僅僅包含前綴查詢 還包含以下幾種

* prefix前綴:一般就是用于搜索推薦自動補全的 最常用
* fuzzy模糊: 對輸入的詞進行模糊查詢并自動補全
* Regex正則:滿足正則表達式的搜索....

prefix參數描述
field推薦結果選取字段
size最大返回推薦數量
skip_duplicates是否去重(默認false)
fuzzy參數描述
fuzziness模糊音字 參考上方的Fuzzy Query中的詳解
transpositions是否允許術語之間的位置交換,默認為ture
min_length輸入的最小長度 默認為3
prefix_length前多少個字符必須完全滿足

3) 查詢語句及返回結果解析

# 通用格式 {"suggest" : {"my-suggestion" : { #一個查詢建議名稱"text" : "tring out Elasticsearch", #查詢文本"term" : { #種類 可以替換為phrase(phrase suggester)/prefix(complite suggester)/fuzzy....."field" : "message" #指定在哪個字段上獲取建議詞}}} } # 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"}}} }# 返回結果格式及解析 # 需要注意term suggester返回的結果為術語,而phrase返回的為一段話# term返回結果解析 # 可以看到在options中返回結果集,text即為推薦的結果 score即為得分 frep為推薦詞出現的詞頻 {"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返回結果解析 # 可以看到根據我們的文本進行短語的模糊搜索并給出一整句話!!這是需要注意的和term的區別 {"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();// 內層的term以及參數 ?還有text給定TermSuggestionBuilder termSug = SuggestBuilders.termSuggestion("content").text("查詢文本").suggestMode(TermSuggestionBuilder.SuggestMode.ALWAYS).size(10);// 外層suggestSuggestBuilder suggestBuilder = new SuggestBuilder();suggestBuilder.addSuggestion("my_suggest", termSug);// 給入suggest到整個查詢中searchSourceBuilder.suggest(suggestBuilder);request.source(searchSourceBuilder);

總結

以上是生活随笔為你收集整理的[ElasticSearch]Suggest查询建议(自动补全纠错)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。