[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正則:滿足正則表達式的搜索....
| field | 推薦結果選取字段 |
| size | 最大返回推薦數量 |
| skip_duplicates | 是否去重(默認false) |
| 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查询建议(自动补全纠错)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Xilinx FPGA通过FLASH加载
- 下一篇: 静态中国风PPT模板