1. 程式人生 > >Elasticsearch搜尋引擎第十一篇-Suggest查詢建議

Elasticsearch搜尋引擎第十一篇-Suggest查詢建議

文章目錄

查詢建議是什麼

查詢建議,能夠為使用者提供良好的使用體驗。主要包括:

  • 拼寫檢查
  • 自動建議查詢詞(自動補全)

如百度、谷歌搜尋:
在這裡插入圖片描述
在這裡插入圖片描述

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
            }
        }
    }
}