詳解elasticsearch實(shí)現(xiàn)基于拼音搜索
1、背景
一般情況下,有些搜索需求是需要根據(jù)拼音和中文來(lái)搜索的,那么在elasticsearch
中是如何來(lái)實(shí)現(xiàn)基于拼音來(lái)搜索的呢?可以通過(guò)elasticsearch-analysis-pinyin
分析器來(lái)實(shí)現(xiàn)。
2、安裝拼音分詞器
# 進(jìn)入 es 的插件目錄 cd /usr/local/es/elasticsearch-8.4.3/plugins # 下載 wget https://github.com/medcl/elasticsearch-analysis-pinyin/releases/download/v8.4.3/elasticsearch-analysis-pinyin-8.4.3.zip # 新建目錄 mkdir analysis-pinyin # 解壓 mv elasticsearch-analysis-pinyin-8.4.3.zip analysis-pinyin && cd analysis-pinyin && unzip elasticsearch-analysis-pinyin-8.4.3.zip && rm -rvf elasticsearch-analysis-pinyin-8.4.3.zip cd ../ && chown -R es:es analysis-pinyin # 啟動(dòng)es /usr/local/es/elasticsearch-8.4.3/bin/elasticsearch -d
3、拼音分詞器提供的功能
每個(gè)選項(xiàng)的含義 可以通過(guò) 文檔中的例子來(lái)看懂。
4、簡(jiǎn)單測(cè)試一下拼音分詞器
4.1 dsl
GET _analyze { "text": ["我是中國(guó)人"], "analyzer": "pinyin" }
"analyzer": "pinyin"
此處的pinyin
是拼音分詞器自帶的。
4.2 運(yùn)行結(jié)果
從圖片上,實(shí)現(xiàn)了拼音分詞,但是這個(gè)不一定滿(mǎn)足我們的需求,比如沒(méi)有中文了,單個(gè)的拼音(比如:wo)是沒(méi)有什么用的,需要對(duì)拼音分詞器進(jìn)行定制化。
5、es中分詞器的組成
在elasticsearch
中分詞器analyzer
由如下三個(gè)部分組成:
character filters:
用于在tokenizer
之前對(duì)文本進(jìn)行處理。比如:刪除字符,替換字符等。tokenizer:
將文本按照一定的規(guī)則分成獨(dú)立的token。即實(shí)現(xiàn)分詞功能。tokenizer filter:
將tokenizer
輸出的詞條做進(jìn)一步的處理。比如: 同義詞處理,大小寫(xiě)轉(zhuǎn)換、移除停用詞,拼音處理等。
6、自定義一個(gè)分詞器實(shí)現(xiàn)拼音和中文的搜索
需求: 自定義一個(gè)分詞器,即可以實(shí)現(xiàn)拼音搜索,也可以實(shí)現(xiàn)中文搜索。
1、創(chuàng)建mapping
PUT /test_pinyin { "settings": { // 分析階段的設(shè)置 "analysis": { // 分析器設(shè)置 "analyzer": { // 自定義分析器,在tokenizer階段使用ik_max_word,在filter上使用py "custom_analyzer": { "tokenizer": "ik_max_word", "filter": "custom_pinyin" } }, // 由于不滿(mǎn)足pinyin分詞器的默認(rèn)設(shè)置,所以我們基于pinyin // 自定義了一個(gè)filter,叫py,其中修改了一些設(shè)置 // 這些設(shè)置可以在pinyin分詞器官網(wǎng)找到 "filter": { "custom_pinyin": { "type": "pinyin", // 不會(huì)這樣分:劉德華 > [liu, de, hua] "keep_full_pinyin": false, // 這樣分:劉德華 > [liudehua] "keep_joined_full_pinyin": true, // 保留原始token(即中文) "keep_original": true, // 設(shè)置first_letter結(jié)果的最大長(zhǎng)度,默認(rèn)值:16 "limit_first_letter_length": 16, // 當(dāng)啟用此選項(xiàng)時(shí),將刪除重復(fù)項(xiàng)以保存索引,例如:de的> de,默認(rèn)值:false,注意:位置相關(guān)查詢(xún)可能受影響 "remove_duplicated_term": true, // 如果非漢語(yǔ)字母是拼音,則將其拆分為單獨(dú)的拼音術(shù)語(yǔ),默認(rèn)值:true,如:liudehuaalibaba13zhuanghan- > liu,de,hua,a,li,ba,ba,13,zhuang,han,注意:keep_none_chinese和keep_none_chinese_together應(yīng)首先啟用 "none_chinese_pinyin_tokenize": false } } } }, // 定義mapping "mappings": { "properties": { "name": { "type": "text", // 創(chuàng)建倒排索引時(shí)使用的分詞器 "analyzer": "custom_analyzer", // 搜索時(shí)使用的分詞器,搜索時(shí)不使用custom_analyzer是為了防止 詞語(yǔ)的拼音一樣,但是中文含義不一樣,導(dǎo)致搜索錯(cuò)誤。 比如: 科技 和 客機(jī),拼音一樣,但是含義不一樣 "search_analyzer": "ik_smart" } } } }
注意:可以看到 我們的 name
字段 使用的分詞器是 custom_analyzer
,這個(gè)是我們?cè)谏弦徊蕉x的。但是搜索的時(shí)候使用的是 ik_smart
,這個(gè)為甚么會(huì)這樣呢?
假設(shè)我們存在如下2個(gè)文本 科技強(qiáng)國(guó)和 這是一架客機(jī), 那么科技和客機(jī)的拼音是不是就是一樣的。 這個(gè)時(shí)候如果搜索時(shí)使用的分詞器也是custom_analyzer
那么,搜索科技的時(shí)候客機(jī)也會(huì)搜索出來(lái),這樣是不對(duì)的。因此在搜索的時(shí)候中文就以中文搜,拼音就以拼音搜。
{ "name": { "type": "text", "analyzer": "custom_analyzer", "search_analyzer": "ik_smart" } }
當(dāng) analyzer
和search_analyzer
的值都是custom_analyzer
,搜索時(shí)也會(huì)通過(guò)拼音搜索,這樣的結(jié)果可能就不是我們想要的。
2、插入數(shù)據(jù)
PUT /test_pinyin/_bulk {"index":{"_id":1}} {"name": "科技強(qiáng)國(guó)"} {"index":{"_id":2}} {"name": "這是一架客機(jī)"} {"index":{"_id":3}}
3、搜索數(shù)據(jù)
參考文檔
以上就是詳解elasticsearch實(shí)現(xiàn)基于拼音搜索的詳細(xì)內(nèi)容,更多關(guān)于elasticsearch 拼音搜索的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java精品項(xiàng)目瑞吉外賣(mài)之員工信息管理篇
這篇文章主要為大家詳細(xì)介紹了java精品項(xiàng)目-瑞吉外賣(mài)訂餐系統(tǒng),此項(xiàng)目過(guò)大,分為多章獨(dú)立講解,本篇內(nèi)容為員工信息分頁(yè)查詢(xún)與啟用或禁用員工狀態(tài),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05Elasticsearch常見(jiàn)字段映射類(lèi)型之scaled_float解讀
這篇文章主要介紹了Elasticsearch常見(jiàn)字段映射類(lèi)型之scaled_float解讀。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11springmvc接口接收參數(shù)與請(qǐng)求參數(shù)格式的整理
這篇文章主要介紹了springmvc接口接收參數(shù)與請(qǐng)求參數(shù)格式的整理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11BUUCTF-easy java WEB-INF/web.xml泄露漏洞及其利用方式
這篇文章主要介紹了BUUCTF-easy java WEB-INF/web.xml泄露漏洞及其利用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07java中List去除重復(fù)數(shù)據(jù)的5種方式總結(jié)
這篇文章主要給大家總結(jié)介紹了關(guān)于java中List去除重復(fù)數(shù)據(jù)的5種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01Springboot項(xiàng)目基于Devtools實(shí)現(xiàn)熱部署步驟詳解
這篇文章主要介紹了Springboot項(xiàng)目基于Devtools實(shí)現(xiàn)熱部署,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06Java并發(fā)編程之Condition源碼分析(推薦)
這篇文章主要介紹了Java并發(fā)編程之Condition源碼分析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03SpringBoot+WebSocket實(shí)現(xiàn)IM及時(shí)通訊的代碼示例
項(xiàng)目中碰到需要及時(shí)通訊的場(chǎng)景,使用springboot集成websocket,即可實(shí)現(xiàn)簡(jiǎn)單的及時(shí)通訊,本文介紹springboot如何集成websocket、IM及時(shí)通訊需要哪些模塊、開(kāi)發(fā)和部署過(guò)程中遇到的問(wèn)題、以及實(shí)現(xiàn)小型IM及時(shí)通訊的代碼,需要的朋友可以參考下2023-10-10