更新時間:2021-11-03 來源:黑馬程序員 瀏覽量:
我們在網(wǎng)頁上搜索內(nèi)容時,常常會看到搜索框跳出與你輸入的文字內(nèi)容相關(guān)的搜索項,這個功能是怎么實現(xiàn)的呢?
需求說明:
當(dāng)用戶在搜索框輸入字符時,我們應(yīng)該提示出與該字符有關(guān)的搜索項,如圖:
使用拼音分詞
要實現(xiàn)根據(jù)字母做補(bǔ)全,就必須對文檔按照拼音分詞。在GitHub上恰好有elasticsearch的拼音分詞插件。地址:https://github.com/medcl/elasticsearch-analysis-pinyin
安裝方式與IK分詞器一樣,分三步:
①解壓
②上傳到虛擬機(jī)中,elasticsearch的plugin目錄
③重啟elasticsearch
④測試
自定義分詞器
elasticsearch中分詞器(analyzer)的組成包含三部分:
character filters:在tokenizer之前對文本進(jìn)行處理。例如刪除字符、替換字符。
tokenizer:將文本按照一定的規(guī)則切割成詞條(term)。例如keyword,就是不分詞;還有ik_smart。
tokenizer filter:將tokenizer輸出的詞條做進(jìn)一步處理。例如大小寫轉(zhuǎn)換、同義詞處理、拼音處理等。
假設(shè)四級考試通過的心情,通過自定義分詞器處理,大概是下面的展現(xiàn)形式:
我們可以在創(chuàng)建索引庫時,通過settings來配置自定義的analyzer(分詞器),創(chuàng)建代碼如下:
PUT /test { "settings": { "analysis": { "analyzer": { // 自定義分詞器 "my_analyzer": { // 分詞器名稱 "tokenizer": "ik_max_word", "filter": "pinyin" } } } } }
PUT /test { "settings": { "analysis": { "analyzer": { // 自定義分詞器 "my_analyzer": { // 分詞器名稱 "tokenizer": "ik_max_word", "filter": "py" } }, "filter": { // 自定義tokenizer filter "py": { // 過濾器名稱 "type": "pinyin", // 過濾器類型,這里是pinyin "keep_full_pinyin": false, "keep_joined_full_pinyin": true, "keep_original": true, "limit_first_letter_length": 16, "remove_duplicated_term": true, "none_chinese_pinyin_tokenize": false } } } } }
拼音分詞器適合在創(chuàng)建倒排索引的時候使用,但不能在搜索的時候使用。
創(chuàng)建倒排索引時:
因此字段在創(chuàng)建倒排索引時應(yīng)該用my_analyzer分詞器;字段在搜索時應(yīng)該使用ik_smart分詞器;
PUT /test { "settings": { "analysis": { "analyzer": { "my_analyzer": { "tokenizer": "ik_max_word", "filter": "py" } }, "filter": { "py": { ... } } } }, "mappings": { "properties": { "name": { "type": "text", "analyzer": "my_analyzer", "search_analyzer": "ik_smart" } } } }
completion suggester查詢
elasticsearch提供了Completion Suggester查詢來實現(xiàn)自動補(bǔ)全功能。這個查詢會匹配以用戶輸入內(nèi)容開頭的詞條并返回。為了提高補(bǔ)全查詢的效率,對于文檔中字段的類型有一些約束:
參與補(bǔ)全查詢的字段必須是completion類型。
字段的內(nèi)容一般是用來補(bǔ)全的多個詞條形成的數(shù)組。completion suggester查詢
// 創(chuàng)建索引庫 PUT test { "mappings": { "properties": { "title":{ "type": "completion" } } } }
// 示例數(shù)據(jù) POST test/_doc { "title": ["Sony", "WH-1000XM3"] } POST test/_doc { "title": ["SK-II", "PITERA"] } POST test/_doc { "title": ["Nintendo", "switch"] }
completion suggester查詢
查詢語法如下:
// 自動補(bǔ)全查詢 GET /test/_search { "suggest": { "title_suggest": { "text": "s", // 關(guān)鍵字 "completion": { "field": "title", // 補(bǔ)全查詢的字段 "skip_duplicates": true, // 跳過重復(fù)的 "size": 10 // 獲取前10條結(jié)果 } } } }
注意:自動補(bǔ)全對字段的要求類型是completion類型,字段值是多詞條的數(shù)組。
案例:實現(xiàn)hotel索引庫的自動補(bǔ)全、拼音搜索功能
實現(xiàn)思路如下:
1.修改hotel索引庫結(jié)構(gòu),設(shè)置自定義拼音分詞器
2.修改索引庫的name、all字段,使用自定義分詞器
3.索引庫添加一個新字段suggestion,類型為completion類型,使用自定義的分詞器
4.給HotelDoc類添加suggestion字段,內(nèi)容包含brand、business
5.重新導(dǎo)入數(shù)據(jù)到hotel庫
注意:name、all是可分詞的,自動補(bǔ)全的brand、business是不可分詞的,要使用不同的分詞器組合
RestAPI實現(xiàn)自動補(bǔ)全
先看請求參數(shù)構(gòu)造的API:
再來看解析:
案例2:實現(xiàn)酒店搜索頁面輸入框的自動補(bǔ)全
查看前端頁面,可以發(fā)現(xiàn)當(dāng)我們在輸入框鍵入時,前端會發(fā)起ajax請求:
在服務(wù)端編寫接口,接收該請求,返回補(bǔ)全結(jié)果的集合,類型為List
猜你喜歡: