Elasticsearch搜尋引擎第十一篇-Suggest查詢建議
阿新 • • 發佈:2018-11-24
文章目錄
查詢建議是什麼
查詢建議,能夠為使用者提供良好的使用體驗。主要包括:
- 拼寫檢查
- 自動建議查詢詞(自動補全)
如百度、谷歌搜尋:
ES查詢建議API
查詢建議也是使用_search端點地址,在DSL中suggest節點來定義需要的建議查詢。
POST twitter/_search
{
"query" : {
"match": {
"message": "tring out Elasticsearch"
}
},
"suggest" : {
"my-suggestion" : { #一個查詢建議名稱
"text" : "tring out Elasticsearch", #查詢文字
"term" : {
"field" : "message" #指定在哪個欄位上獲取建議詞
}
}
}
}
#多個建議查詢可以使用全域性的查詢文字
POST _search
{
"suggest": {
"text" : "tring out Elasticsearch",
"my-suggest-1" : {
"term" : {
"field" : "message"
}
},
"my-suggest-2" : {
"term" : {
"field" : "user"
}
}
}
}
Suggester介紹
term suggester
term 詞項建議器,對給入的文字進行分詞,為每個詞進行模糊查詢提供詞項建議。對於在索引中存在詞預設不提供建議詞,不存在的詞則根據模糊查詢結果進行排序後取一定數量的建議詞。
常用的建議選項:
phrase suggester
phrase 短語建議,在term的基礎上,會考量多個term之間的關係,比如是否同時出現在索引的原文裡,相鄰程度,以及詞頻等
POST /ftq/_search
{
"query": {
"match_all": {}
},
"suggest" : {
"myss":{
"text": "java sprin boot",
"phrase": {
"field": "title"
}
}
}
}
completion suggester 自動補全
針對自動補全場景而設計的建議器。此場景下使用者每輸入一個字元的時候,就需要即時傳送一次查詢請求到後端查詢匹配項,在使用者輸入速度較高的情況下對後端響應速度要求比較苛刻。因此實現上它和前面兩個Suggester採用了不同的資料結構,索引並非通過倒排來完成,而是將analyze過的資料編碼成FST和索引一起存放。對於一個open狀態的索引,FST會被ES整個裝載到記憶體裡的,進行字首查詢速度極快。但是FST只能用於字首查詢,這也是Completion Suggester的侷限所在。
參考官網:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-suggesters-completion.html
為了使用自動補全,索引中用來提供補全建議的欄位需特殊設計,欄位型別為 completion。
定義一個索引:
PUT music
{
"mappings": {
"_doc" : {
"properties" : {
"suggest" : {
"type" : "completion" #定義該欄位是自動補全的欄位
},
"title" : {
"type": "keyword"
}
}
}
}
}
存入文件1和文件2,兩個文件內容一樣:
PUT music/_doc/1?refresh
{
"suggest" : {
"input": [ "Nevermind", "Nirvana" ], #指定輸入值
"weight" : 34 #指定排序值(可選)
}
}
PUT music/_doc/2?refresh
{
"suggest" : {
"input": [ "Nevermind", "Nirvana" ],
"weight" : 20
}
}
查詢看看:
POST music/_search?pretty
{
"suggest": {
"song-suggest" : {
"prefix" : "nir",
"completion" : {
"field" : "suggest"
}
}
}
}
POST music/_search?pretty
{
"suggest": {
"song-suggest" : {
"prefix" : "nir",
"completion" : {
"field" : "suggest",
"skip_duplicates": true #去重
}
}
}
}
接著存入文件3和文件4,存的是短語:
PUT music/_doc/3?refresh
{
"suggest" : {
"input": [ "lucene solr", "lucene so cool","lucene elasticsearch" ],
"weight" : 20
}
}
PUT music/_doc/4?refresh
{
"suggest" : {
"input": ["lucene solr cool","lucene elasticsearch" ],
"weight" : 10
}
}
再查詢看看:
POST music/_search?pretty
{
"suggest": {
"song-suggest" : {
"prefix" : "lucene s",
"completion" : {
"field" : "suggest" ,
"skip_duplicates": true
}
}
}
}