elasticsearch實現(xiàn)基于拼音搜索

1搞挣、背景

一般情況下,有些搜索需求是需要根據(jù)拼音中文來搜索的所坯,那么在elasticsearch中是如何來實現(xiàn)基于拼音來搜索的呢蒜绽?可以通過elasticsearch-analysis-pinyin分析器來實現(xiàn)。

2、安裝拼音分詞器

# 進入 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
# 啟動es
/usr/local/es/elasticsearch-8.4.3/bin/elasticsearch -d

3厉碟、拼音分詞器提供的功能

拼音分詞器提供如下功能

拼音分詞器提供的功能

每個選項的含義 可以通過 文檔中的例子來看懂。

4屠缭、簡單測試一下拼音分詞器

4.1 dsl

GET _analyze
{
  "text": ["我是中國人"],
  "analyzer": "pinyin"
}

"analyzer": "pinyin" 此處的pinyin是拼音分詞器自帶的箍鼓。

4.2 運行結果

運行結果

從圖片上,實現(xiàn)了拼音分詞呵曹,但是這個不一定滿足我們的需求款咖,比如沒有中文了,單個的拼音(比如:wo)是沒有什么用的奄喂,需要對拼音分詞器進行定制化铐殃。

5、es中分詞器的組成

elasticsearch中分詞器analyzer由如下三個部分組成:

  1. character filters: 用于在tokenizer之前對文本進行處理跨新。比如:刪除字符富腊,替換字符等。
  2. tokenizer: 將文本按照一定的規(guī)則分成獨立的token域帐。即實現(xiàn)分詞功能赘被。
  3. tokenizer filter:tokenizer輸出的詞條做進一步的處理。比如: 同義詞處理肖揣,大小寫轉換民假、移除停用詞,拼音處理等龙优。
處理流程

6羊异、自定義一個分詞器實現(xiàn)拼音和中文的搜索

需求: 自定義一個分詞器,即可以實現(xiàn)拼音搜索彤断,也可以實現(xiàn)中文搜索野舶。

1、創(chuàng)建mapping

PUT /test_pinyin
{
  "settings": {
    // 分析階段的設置
    "analysis": {
      // 分析器設置
      "analyzer": {
        // 自定義分析器瓦糟,在tokenizer階段使用ik_max_word筒愚,在filter上使用py
        "custom_analyzer": {
          "tokenizer": "ik_max_word",
          "filter": "custom_pinyin"
        }
      },
      // 由于不滿足pinyin分詞器的默認設置,所以我們基于pinyin
      // 自定義了一個filter菩浙,叫py巢掺,其中修改了一些設置
      // 這些設置可以在pinyin分詞器官網(wǎng)找到
      "filter": {
        "custom_pinyin": {
          "type": "pinyin",
          // 不會這樣分:劉德華 > [liu, de, hua]
          "keep_full_pinyin": false,
          // 這樣分:劉德華 > [liudehua]
          "keep_joined_full_pinyin": true,
          // 保留原始token(即中文)
          "keep_original": true,
          // 設置first_letter結果的最大長度,默認值:16
          "limit_first_letter_length": 16,
          // 當啟用此選項時劲蜻,將刪除重復項以保存索引陆淀,例如:de的> de,默認值:false先嬉,注意:位置相關查詢可能受影響
          "remove_duplicated_term": true,
          // 如果非漢語字母是拼音轧苫,則將其拆分為單獨的拼音術語,默認值:true,如:liudehuaalibaba13zhuanghan- > liu含懊,de身冬,hua,a岔乔,li酥筝,ba,ba,13,zhuang冻押,han蜡镶,注意:keep_none_chinese和keep_none_chinese_together應首先啟用
          "none_chinese_pinyin_tokenize": false
        }
      }
    }
  },
  // 定義mapping
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        // 創(chuàng)建倒排索引時使用的分詞器
        "analyzer": "custom_analyzer",
        // 搜索時使用的分詞器,搜索時不使用custom_analyzer是為了防止 詞語的拼音一樣,但是中文含義不一樣,導致搜索錯誤。 比如: 科技 和 客機步脓,拼音一樣,但是含義不一樣
        "search_analyzer": "ik_smart"
      }
    }
  }
}

注意:
可以看到 我們的 name字段 使用的分詞器是 custom_analyzer蝇更,這個是我們在上一步定義的沪编。但是搜索的時候使用的是 ik_smart,這個為甚么會這樣呢年扩?
假設我們存在如下2個文本 科技強國這是一架客機蚁廓, 那么科技客機的拼音是不是就是一樣的。 這個時候如果搜索時使用的分詞器也是custom_analyzer那么厨幻,搜索科技的時候客機也會搜索出來相嵌,這樣是不對的。因此在搜索的時候中文就以中文搜况脆,拼音就以拼音搜饭宾。

{
  "name": {
    "type": "text",
    "analyzer": "custom_analyzer",
    "search_analyzer": "ik_smart"
  }
}

analyzersearch_analyzer的值都是custom_analyzer,搜索時也會通過拼音搜索格了,這樣的結果可能就不是我們想要的看铆。

2、插入數(shù)據(jù)

PUT /test_pinyin/_bulk
{"index":{"_id":1}}
{"name": "科技強國"}
{"index":{"_id":2}}
{"name": "這是一架客機"}
{"index":{"_id":3}}

3盛末、搜索數(shù)據(jù)

搜索數(shù)據(jù)

7弹惦、參考文檔

1、https://github.com/medcl/elasticsearch-analysis-pinyin/tree/master

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末悄但,一起剝皮案震驚了整個濱河市棠隐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌檐嚣,老刑警劉巖助泽,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡嗡贺,警方通過查閱死者的電腦和手機隐解,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诫睬,“玉大人厢漩,你說我怎么就攤上這事⊙页迹” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵宵膨,是天一觀的道長架谎。 經(jīng)常有香客問我,道長辟躏,這世上最難降的妖魔是什么谷扣? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮捎琐,結果婚禮上会涎,老公的妹妹穿的比我還像新娘。我一直安慰自己瑞凑,他們只是感情好末秃,可當我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著籽御,像睡著了一般练慕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上技掏,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天铃将,我揣著相機與錄音,去河邊找鬼哑梳。 笑死劲阎,一個胖子當著我的面吹牛,可吹牛的內容都是我干的鸠真。 我是一名探鬼主播悯仙,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼弧哎!你這毒婦竟也來了雁比?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤撤嫩,失蹤者是張志新(化名)和其女友劉穎偎捎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡茴她,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年寻拂,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丈牢。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡祭钉,死狀恐怖,靈堂內的尸體忽然破棺而出己沛,到底是詐尸還是另有隱情慌核,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布申尼,位于F島的核電站垮卓,受9級特大地震影響,放射性物質發(fā)生泄漏师幕。R本人自食惡果不足惜粟按,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望霹粥。 院中可真熱鬧灭将,春花似錦、人聲如沸后控。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽浩淘。三九已至矾利,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間馋袜,已是汗流浹背男旗。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留欣鳖,地道東北人察皇。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像泽台,于是被迫代替她去往敵國和親什荣。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內容