elasticsearch5.x:查詢建議介紹、Suggester 介紹以及Java-api實現

 

elasticsearch5.x:查詢建議介紹、Suggester 介紹


參考:http://www.cnblogs.com/leeSmall/p/9206646.html

參考(重點):https://elasticsearch.cn/article/142

參考(官網):https://www.elastic.co/guide/en/elasticsearch/reference/current/search-suggesters-completion.html


一、查詢建議介紹

1. 查詢建議是什么?

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

拼寫檢查如圖:?image

自動建議查詢詞(自動補全):?image

2. ES中查詢建議的API

查詢建議也是使用_search端點地址。在DSL中suggest節點來定義需要的建議查詢

示例1:定義單個建議查詢詞
POST twitter/_search
{"query" : {"match": {"message": "tring out Elasticsearch"}},"suggest" : { <!-- 定義建議查詢 -->"my-suggestion" : { <!-- 一個建議查詢名 -->"text" : "tring out Elasticsearch", <!-- 查詢文本 -->"term" : { <!-- 使用詞項建議器 -->"field" : "message" <!-- 指定在哪個字段上獲取建議詞 -->}}}
}PUT  index
{"mappings":{"completion":{"properties":{"title": {"type": "text","analyzer": "ik_smart"},"title_suggest": {"type": "completion","analyzer": "ik_smart","search_analyzer": "ik_smart"}}}}}

  

示例2:定義多個建議查詢詞
POST _search
{"suggest": {"my-suggest-1" : {"text" : "tring out Elasticsearch","term" : {"field" : "message"}},"my-suggest-2" : {"text" : "kmichy","term" : {"field" : "user"}}}
}

?

示例3:多個建議查詢可以使用全局的查詢文本
POST _search
{"suggest": {"text" : "tring out Elasticsearch","my-suggest-1" : {"term" : {"field" : "message"}},"my-suggest-2" : {"term" : {"field" : "user"}}}
}

?

二、Suggester 介紹

1. Term suggester

term 詞項建議器,對給入的文本進行分詞,為每個詞進行模糊查詢提供詞項建議。對于在索引中存在詞默認不提供建議詞,不存在的詞則根據模糊查詢結果進行排序后取一定數量的建議詞。

常用的建議選項:?image

示例1:

POST twitter/_search
{"query" : {"match": {"message": "tring out Elasticsearch"}},"suggest" : { <!-- 定義建議查詢 -->"my-suggestion" : { <!-- 一個建議查詢名 -->"text" : "tring out Elasticsearch", <!-- 查詢文本 -->"term" : { <!-- 使用詞項建議器 -->"field" : "message" <!-- 指定在哪個字段上獲取建議詞 -->}}}
}

  

2. phrase suggester

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

示例
POST twitter/_search
{"query" : {"match": {"message": "tring out Elasticsearch"}},"suggest" : {"my-suggestion" : {"text" : "tring out Elasticsearch","phrase" : {"field" : "message"}}}
}

?

結果:
{"took": 30,"timed_out": false,"_shards": {"total": 5,"successful": 5,"skipped": 0,"failed": 0},"hits": {"total": 2,"max_score": 1.113083,"hits": [{"_index": "twitter","_type": "tweet","_id": "4","_score": 1.113083,"_source": {"user": "kimchy","postDate": "2018-07-23T07:29:57.653Z","message": "trying out Elasticsearch"}},{"_index": "twitter","_type": "tweet","_id": "7","_score": 0.98382175,"_source": {"user": "yuchen20","postDate": "2018-07-23T08:12:05.604Z","message": "trying out Elasticsearch"}}]},"suggest": { <!-- 建議-->"my-suggestion": [{"text": "tring out Elasticsearch","offset": 0,"length": 23,"options": [{{"text": "trying out elasticsearch","score": 0.5118434}]}]}
}

  

3. Completion suggester 自動補全

針對自動補全場景而設計的建議器。此場景下用戶每輸入一個字符的時候,就需要即時發送一次查詢請求到后端查找匹配項,在用戶輸入速度較高的情況下對后端響應速度要求比較苛刻。因此實現上它和前面兩個Suggester采用了不同的數據結構,索引并非通過倒排來完成,而是將analyze過的數據編碼成FST和索引一起存放。對于一個open狀態的索引,FST會被ES整個裝載到內存里的,進行前綴查找速度極快。但是FST只能用于前綴查找,這也是Completion Suggester的局限所在。

官網鏈接:

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-suggesters-completion.html

示例1:

為了使用自動補全,索引中用來提供補全建議的字段需特殊設計,字段類型為 completion。 先設置mapping:

PUT  index/
{"mappings":{"completion":{"properties":{"title": {"type": "text","analyzer": "ik_smart"},"title_suggest": {"type": "completion","analyzer": "ik_smart","search_analyzer": "ik_smart"}}}}}

?

重點是title_suggest,這個字段就是之后我們搜索補全的字段,需要設置type為completion,analyzer按情況設置分析器

索引數據:

POST /index/completion/_bulk
{ "index" : { } }
{ "title": "背景天安門廣場大學", "title_suggest": "背景天安門廣場大學"}
{ "index" : { } }
{ "title": "北京天安門","title_suggest": "北京天安門"}
{ "index" : { } }
{ "title": "北京鳥巢","title_suggest": "北京鳥巢"}
{ "index" : { } }
{ "title": "奧林匹克公園","title_suggest": "奧林匹克公園"}
{ "index" : { } }
{ "title": "奧林匹克森林公園","title_suggest": "奧林匹克森林公園"}
{ "index" : { } }
{ "title": "北京奧林匹克公園","title_suggest": "北京奧林匹克公園"}
{ "index" : { } }
{ "title": "北京奧林匹克公園","title_suggest": {"input": "我愛中國","weight": 100}}

?

索引的時候可以對suggest字段,增加weight增加排序權重

搜索補全:

POST /index/completion/_search
{"size": 0,"suggest":{"blog-suggest":{"prefix":"北京","completion":{"field":"title_suggest"}}}
}

?

結果:

{"took": 3,"timed_out": false,"_shards": {"total": 5,"successful": 5,"skipped": 0,"failed": 0},"hits": {"total": 0,"max_score": 0,"hits": []},"suggest": {"blog-suggest": [{"text": "北京","offset": 0,"length": 2,"options": [{"text": "北京天安門","_index": "index","_type": "completion","_id": "AWSRo_hn9K_aupETR6FR","_score": 1,"_source": {"title": "北京天安門","title_suggest": "北京天安門"}},{"text": "北京奧林匹克公園","_index": "index","_type": "completion","_id": "AWSRo_hn9K_aupETR6FV","_score": 1,"_source": {"title": "北京奧林匹克公園","title_suggest": "北京奧林匹克公園"}},{"text": "北京鳥巢","_index": "index","_type": "completion","_id": "AWSRo_hn9K_aupETR6FS","_score": 1,"_source": {"title": "北京鳥巢","title_suggest": "北京鳥巢"}}]}]}
}

?

示例2:

創建映射

PUT music
{"mappings": {"docc" : {"properties" : {"suggest" : {"type" : "completion"},"title" : {"type": "keyword"}}}}
}

  

Input 指定輸入詞 Weight 指定排序值(可選)
PUT music/docc/1?refresh
{"suggest" : {"input": [ "Nevermind", "Nirvana" ],"weight" : 34}
}

  

指定不同的排序值:

PUT music/_doc/1?refresh
{"suggest" : [{"input": "Nevermind","weight" : 10},{"input": "Nirvana","weight" : 3}]}

  

放入一條重復數據

PUT music/docc/2?refresh
{"suggest" : {"input": [ "Nevermind", "Nirvana" ],"weight" : 20}
}

?

查詢建議根據前綴查詢:

POST music/_search?pretty
{"suggest": {"song-suggest" : {"prefix" : "nir", "completion" : { "field" : "suggest" }}}
}

  

對建議查詢結果去重: "skip_duplicates": true ,該特性在6.x支持,5.x不支持

POST music/_search?pretty
{"suggest": {"song-suggest" : {"prefix" : "nir", "completion" : { "field" : "suggest","skip_duplicates": true }}    }}

?

查詢建議文檔存儲短語

PUT music/docc/3?refresh
{"suggest" : {"input": [ "lucene solr", "lucene so cool","lucene elasticsearch" ],"weight" : 20}
}PUT music/docc/4?refresh
{"suggest" : {"input": ["lucene solr cool","lucene elasticsearch" ],"weight" : 10}
}

?

查詢

POST music/_search?pretty
{"suggest": {"song-suggest" : {"prefix" : "lucene s", "completion" : { "field" : "suggest" }}}}

 三 、java -api

## elasticsearch5.x:查詢建議java-api介紹、Suggester 介紹
參考:http://www.mamicode.com/info-detail-2347270.htmlpackage com.youlan.es.util;import java.util.concurrent.ExecutionException;import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.rest.RestStatus;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.suggest.*;
import org.elasticsearch.search.suggest.completion.CompletionSuggestion;
import org.elasticsearch.search.suggest.phrase.PhraseSuggestion;
import org.elasticsearch.search.suggest.term.TermSuggestion;public class SuggestDemo {private static Logger logger = LogManager.getRootLogger();//拼寫檢查(英文)public static void termSuggest(TransportClient client) {// 1、創建search請求//SearchRequest searchRequest = new SearchRequest();SearchRequest searchRequest = new SearchRequest("twitter");// 2、用SearchSourceBuilder來構造查詢請求體 ,請仔細查看它的方法,構造各種查詢的方法都在這。SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();sourceBuilder.size(0);//做查詢建議//詞項建議SuggestionBuilder termSuggestionBuilder =SuggestBuilders.termSuggestion("message").text("tring out Elticsearch");//搜索框輸入內容:tring out ElticsearchSuggestBuilder suggestBuilder = new SuggestBuilder();suggestBuilder.addSuggestion("suggest_user", termSuggestionBuilder);sourceBuilder.suggest(suggestBuilder);searchRequest.source(sourceBuilder);try{//3、發送請求SearchResponse searchResponse = client.search(searchRequest).get();//4、處理響應//搜索結果狀態信息if(RestStatus.OK.equals(searchResponse.status())) {// 獲取建議結果Suggest suggest = searchResponse.getSuggest();TermSuggestion termSuggestion = suggest.getSuggestion("suggest_user");for (TermSuggestion.Entry entry : termSuggestion.getEntries()) {logger.info("text: " + entry.getText().string());for (TermSuggestion.Entry.Option option : entry) {String suggestText = option.getText().string();//建議內容logger.info("   suggest option : " + suggestText);}}}} catch (InterruptedException | ExecutionException e) {logger.error(e);}/*"suggest": {"my-suggestion": [{"text": "tring","offset": 0,"length": 5,"options": [{"text": "trying","score": 0.8,"freq": 2}]},{"text": "out","offset": 6,"length": 3,"options": []},{"text": "elasticsearch","offset": 10,"length": 13,"options": []}]}*/}public static void phraseSuggest(TransportClient client){//1、創建search請求SearchRequest searchRequest = new SearchRequest("twitter");//2、構造查詢qing'qi請求體SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();sourceBuilder.size(0);SuggestionBuilder phraseSuggestBuilder = SuggestBuilders.phraseSuggestion( "message").text("tring out");SuggestBuilder suggestBuilder = new SuggestBuilder();suggestBuilder.addSuggestion("my-suggestion",phraseSuggestBuilder);sourceBuilder.suggest(suggestBuilder);searchRequest.source(sourceBuilder);try {//3、發送請求SearchResponse searchResponse = client.search(searchRequest).get();//4、處理響應//搜索狀態信息if (RestStatus.OK.equals(searchResponse.status())){//獲得建議Suggest suggest = searchResponse.getSuggest();PhraseSuggestion phraseSuggestion =suggest.getSuggestion("my-suggestion");for (PhraseSuggestion.Entry entry:phraseSuggestion){logger.info("text:"+entry.getText().string());for (PhraseSuggestion.Entry.Option option:entry){String suggestText = option.getText().string();logger.info("   suggest option :"+suggestText);}}}} catch (InterruptedException e) {logger.error("請求出錯:"+e);} catch (ExecutionException e) {logger.error(e);}}//自動補全public static void completionSuggester(TransportClient client) {// 1、創建search請求//SearchRequest searchRequest = new SearchRequest();SearchRequest searchRequest = new SearchRequest("music");// 2、用SearchSourceBuilder來構造查詢請求體 ,請仔細查看它的方法,構造各種查詢的方法都在這。SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();sourceBuilder.size(0);//做查詢建議//自動補全/*POST music/_search?pretty{"suggest": {"song-suggest" : {"prefix" : "lucene s","completion" : {"field" : "suggest" ,"skip_duplicates": true}}}}*/SuggestionBuilder termSuggestionBuilder =SuggestBuilders.completionSuggestion("suggest").prefix("lucene s");// .skipDuplicates(true) 6.x去重;SuggestBuilder suggestBuilder = new SuggestBuilder();suggestBuilder.addSuggestion("song-suggest", termSuggestionBuilder);sourceBuilder.suggest(suggestBuilder);searchRequest.source(sourceBuilder);try {//3、發送請求SearchResponse searchResponse = client.search(searchRequest).get();//4、處理響應//搜索結果狀態信息if(RestStatus.OK.equals(searchResponse.status())) {// 獲取建議結果Suggest suggest = searchResponse.getSuggest();CompletionSuggestion termSuggestion = suggest.getSuggestion("song-suggest");for (CompletionSuggestion.Entry entry : termSuggestion.getEntries()) {logger.info("text: " + entry.getText().string());for (CompletionSuggestion.Entry.Option option : entry) {String suggestText = option.getText().string();logger.info("   suggest option : " + suggestText);}}}} catch (InterruptedException | ExecutionException e) {logger.error(e);}
//        結果:
//        {
//            "took": 7,
//                "timed_out": false,
//                "_shards": {
//            "total": 5,
//                    "successful": 5,
//                    "skipped": 0,
//                    "failed": 0
//        },
//            "hits": {
//            "total": 0,
//                    "max_score": 0,
//                    "hits": []
//        },
//            "suggest": {
//            "song-suggest": [
//            {
//                "text": "lucene s",
//                    "offset": 0,
//                    "length": 8,
//                    "options": [
//                {
//                    "text": "lucene so cool",
//                        "_index": "music",
//                        "_type": "docc",
//                        "_id": "3",
//                        "_score": 20,
//                        "_source": {
//                    "suggest": {
//                        "input": [
//                        "lucene solr",
//                                "lucene so cool",
//                                "lucene elasticsearch"
//                ],
//                        "weight": 20
//                    }
//                }
//                },
//                {
//                    "text": "lucene solr cool",
//                        "_index": "music",
//                        "_type": "docc",
//                        "_id": "4",
//                        "_score": 10,
//                        "_source": {
//                    "suggest": {
//                        "input": [
//                        "lucene solr cool",
//                                "lucene elasticsearch"
//                ],
//                        "weight": 10
//                    }
//                }
//                }
//        ]
//            }
//    ]
//        }
//        }}public static void main(String[] args) {EsClient esClient= new EsClient();try (TransportClient client =esClient.getConnection() ;) {logger.info("---------------- 拼寫檢查:termSuggest----------------------");termSuggest(client);logger.info("------------------ 短語建議:phraseSuggest--------------------");phraseSuggest(client);logger.info("------------------ 自動補全:completionSuggester--------------------");completionSuggester(client);} catch (Exception e) {logger.error(e);}}
}

  

轉載于:https://www.cnblogs.com/hengzhi/p/9374415.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/251120.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/251120.shtml
英文地址,請注明出處:http://en.pswp.cn/news/251120.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DOM-2 document對象、獲取元素、節點、遍歷樹

一、document獲取元素 1. 方法 document.getElementById(‘box’) // 在IE8及以下是不分大小寫的&#xff0c;而且name值也能匹配上document.getElementsByClassName(’’) // IE8及以下是用不了的document.getElementsByTagName() 都兼容document.getElementsByName() 用的非…

javascript --- js中的事件

事件實現松耦合: // JS和HTML之間的交互是通過事件實現的. // 事件,就是文檔或瀏覽器窗口中發生一些特定的交互瞬間. // 可以使用偵聽器來預定事件,以便事件發生時執行相應的代碼. // 這種在傳統軟件工程中被稱為觀察員模式的模型,支持頁面的行為與頁面的外觀之間的松耦合事件…

centos系統設置局域網靜態IP

---恢復內容開始--- centos系統設置局域網靜態IP 很多時候&#xff0c;我們并不希望漏油器重啟之后&#xff0c;自己的服務器動態的獲取IP&#xff0c;這樣很不利&#xff0c;因為你可能裝了mysql&#xff0c;redis&#xff0c;等軟件&#xff0c;然后需要遠程去訪問這臺服務器…

SQLServer數據庫(二)

數據庫設計&#xff1a;就是將數據庫中的數據庫實體及這些數據庫實體之間的關系&#xff0c;進行規劃和結構化的過程。 項目開發過程&#xff1a; 需求分析 概要設計 詳細設計 代碼編寫 運行測試 打包發行 數據庫的系統分析基本步驟&#xff1a;收集信息、標識實體、標識每個實…

DOM-3 【utils/待講評】節點屬性、方法、封裝方法、DOM結構

講評 節點屬性 nodeType 元素節點 1 大寫 屬性節點 2 文本節點 3 #text 注釋節點 8 #comment document 9 DocumentFragment 11 nodeName是只讀屬性元素節點的nodeName是大寫的其余的是#小寫的元素節點沒有nodeValue屬性&#xff0c;null&#xff0c;是可寫的其余有&#xff08…

javascript --- DOM0級、DOM2級、跨瀏覽器 的事件處理程序

DOM0級事件處理程序: // 使用DOM0級方法指定的事件處理程序被認為是元素的方法 // 這個時候的事件處理程序是在元素的作用域中運行: <div id "myBtn" >DOM0</div> <script>var btn document.getElementById("myBtn");btn.onclick fun…

collections deque隊列及其他隊列

from collections import dequedq deque(range(10),maxlen10) dq.rotate(3)#隊列旋轉操作接受一個參數N&#xff0c;讓N>0時&#xff0c;隊列的最右邊N個元素會被移動到隊列最左邊&#xff0c;反之會移到隊列最右邊 dq.appendleft(-1)#頭部添加dq.extend([11,22,33])#尾部添…

002 模板實參推斷、重載與模板

模板實參推斷 一、模板函數顯示實參 情況1&#xff1a; template <typename T1, typename T2, typename T3> T1 sum(T2 a, T3 b) {return a b; } 分析&#xff1a;調用的時候就需要指定T1的類型&#xff0c;如&#xff1a;sum<float>(1, 2); 于是sum函數的返回類型…

DOM-4 【utils/待講評】節點創建刪除、元素屬性設置獲取、節點屬性

講評 節點創建 Document.prototype ← document.createElement(div)document.createTextNode(xxx) // 創建文本節點document.createComment(xxx) // 創建注釋節點 增加/剪切子節點 Node.prototype ← node.appendChild(node)總是在父元素的最后增加&#xff08;類似push&am…

javascript --- 事件對象和事件類型

// 無論程序使用"DOM0級"規范還是"DOM2級"規范,都會在局部產生一個event對象, // 將其打印出來研究: <div id"divBtn"><button id"rawBtn" >Click Me!</button></div> <script>const divBtn document…

關于APP更新,兩包共存的解決方案

大多數是由于包名不一致導致的&#xff0c;一定要注意包名一致、不然手機會認為是兩個app&#xff0c;導致兩個包共存 查看包名的方法 1、hbuilder打包時會有提示 2、手機打開設置->應用->正在運行->對應app即可查看 轉載于:https://www.cnblogs.com/zz-0128/p/827969…

DOM-5【兼容】滾動距離與高度、兼容模式、可視尺寸

查看滾動條的距離 方法版本window.pageXOffset / pageYOffsetIE9/IE8及以下不支持(常規)document.body.scrollLeft/scrollTopIE9/IE8及以下(部分支持&#xff0c;具體看模式)document.documentElement.scrollLeft/scrollTopIE9/IE8及以下(部分支持&#xff0c;具體看模式)wind…

python中with及closing

推薦使用 "with"語句 以管理文件:with open("hello.txt") as hello_file: for line in hello_file: print line對于不支持使用"with"語句的類似文件的對象,使用 contextlib.closing():import contextlibwith contextlib.closing(urlli…

http --- Web頁面請求的歷程(如何根據URL尋找到需要的資源)

HTTP概況: // 超文本傳輸協議(HyperText Transfer Protocol,HTTP):是Web的應用層協議,它是Web的核心. // 客戶端和服務器運行在不同的端系統中,通過交換HTTP報文進行會話 // HTTP定義了這些報文的結構以及客戶和服務器進行報文交換的方式 // HTTP定義了Web客戶向Web服務器請求…

DOM-6 【兼容】讀寫樣式屬性、操作偽元素、運動元素初探

規范 <style type"text/css"></style><script type"text/javascript"></script>讀寫樣式屬性 .style是訪問不到css樣式表的&#xff0c;只能訪問到行內/內聯的屬性&#xff0c;當未設置行內屬性時&#xff0c;結果為空字符串 設…

RGBD論文閱讀筆記

Single-Image Depth Perception in the Wild 簡要記載一下對于利用RGB圖像depth圖像得到segmentation的論文。 論文名稱&#xff1a;Cascaded Feature Network for Semantic Segmentation of RGB-D Images 論文出處 ICCV 2017 Lin 模型結構 數據集 NYUDv2 SUN-RGBD 性能分析 總…

vue組件調用(全局調用和局部調用)

當用vue-cli創建一個項目后, 創建項目的方法: https://www.cnblogs.com/fps2tao/p/9376847.html 編寫了組件怎么,在其他組件中調用了? 組件listBox: 路徑 src/components/listBox.vue <template><div class"listBox">listBox222</div> </templ…

http --- 路由器緩存與常見的狀態碼

路由器的緩存: // 當下路由器其主要系統性能指吞吐率、利用率、丟包率、延遲、緩存大小和實現復雜性等. // 當鏈路上發生擁塞時能夠對新進入的數據包進行緩存 // 從而降低丟包率、維持高的鏈路利用率 // 用于存放路由表的內存,速度快,價格也高狀態碼: // 為客戶端提供了一種理…

DOM-7 【兼容】事件處理函數、冒泡捕獲、阻止冒泡默認事件

事件處理函數 綁定事件 綁定事件的處理函數&#xff08;事件本身是存在的&#xff0c;綁定的是相應的反饋&#xff09;事件 事件的反饋 前端交互 &#xff08;前端核心&#xff09; 綁定事件的方式 1. 句柄綁定 默認&#xff08;只能&#xff09;是事件冒泡這種事件流為…

javascript --- XHR(XMLHttpRequet)對象

XHR: // XHR(XMLHttpRequest):為向服務器發送請求和解析服務器響應提供了流暢的接口 // 能夠以異步方式從服務器取得更多信息,意味著用戶點擊后,可以不必刷新頁面也能取得新數據 // 換句話說,可以使用XHR對象獲取新數據,然后再通過DOM將新數據插入到頁面中.XMLHttpRequest對象…