Elasticsearch 外部詞庫文件更新

本文所使用的ES集群環(huán)境可在歷史文章中獲取,采用docker部署的方式察纯。

Elasticsearch 是一個功能強(qiáng)大的搜索引擎,廣泛用于構(gòu)建復(fù)雜的全文搜索應(yīng)用程序。在許多情況下甜攀,為了提高搜索引擎的性能和精度秋泄,我們可以使用外部詞庫來定制和擴(kuò)展 Elasticsearch 的文本處理和搜索功能。本文將介紹外部詞庫的用途规阀、優(yōu)勢以及如何在 Elasticsearch 中使用它們恒序。

為什么需要外部詞庫?

Elasticsearch 默認(rèn)提供了一套強(qiáng)大的文本處理工具谁撼,包括分詞歧胁、標(biāo)記過濾、同義詞處理等厉碟。然而喊巍,在某些情況下,我們需要更多的控制權(quán)來適應(yīng)特定的用例和需求箍鼓。外部詞庫允許我們:

  1. 自定義分詞器:通過使用外部詞庫崭参,您可以創(chuàng)建自定義分詞器款咖,以根據(jù)特定需求定義文本分割規(guī)則何暮。這對于處理不同語言或行業(yè)的文本非常有用。

  2. 擴(kuò)展停用詞列表:停用詞(如and铐殃、the等)通常被排除在搜索索引之外海洼。外部詞庫允許您將領(lǐng)域特定的停用詞添加到索引中,以便更好地適應(yīng)我們行業(yè)內(nèi)的數(shù)據(jù)富腊。

  3. 同義詞處理:創(chuàng)建同義詞詞庫可確保相關(guān)詞匯在搜索時被正確映射贰军,提高搜索結(jié)果的準(zhǔn)確性。

  4. 專業(yè)術(shù)語:對于特定領(lǐng)域或行業(yè)蟹肘,我們可以通過創(chuàng)建外部詞庫词疼,以包含特定領(lǐng)域的專業(yè)術(shù)語,確保搜索引擎能夠理解和處理這些術(shù)語帘腹。

使用外部詞庫的優(yōu)勢

使用外部詞庫有以下優(yōu)勢:

  1. 提高搜索質(zhì)量:通過自定義分詞和停用詞贰盗,可以確保搜索引擎更好地理解和處理文本,提高搜索質(zhì)量阳欲。

  2. 適應(yīng)特定需求:外部詞庫允許根據(jù)特定用例和領(lǐng)域需求對搜索引擎進(jìn)行定制舵盈,以滿足工作要求。

  3. 更好的用戶體驗(yàn):通過包含專業(yè)術(shù)語和擴(kuò)展的同義詞映射球化,用戶能夠更輕松地找到他們需要的內(nèi)容秽晚。

如何在 Elasticsearch 中使用外部詞庫

在 Elasticsearch 中使用外部詞庫通常涉及以下步驟:

  1. 創(chuàng)建外部詞庫文件:首先,我們需要準(zhǔn)備一個外部詞庫文件筒愚,其中包含自定義的詞匯赴蝇、同義詞或停用詞列表。

  2. 將詞庫上傳到 Elasticsearch:上傳詞庫文件到 Elasticsearch

  3. 配置索引:將外部詞庫與索引相關(guān)聯(lián)巢掺,以確保 Elasticsearch 在索引文檔時使用這些詞匯句伶。

  4. 搜索優(yōu)化:根據(jù)需要在搜索查詢中應(yīng)用外部詞庫劲蜻,以擴(kuò)展或定制搜索行為。

示例:使用自定義詞庫分詞

本文在 IK分詞器的基礎(chǔ)上增加自定義分詞考余,并配置本地詞庫文件先嬉,遠(yuǎn)程熱更新詞庫文件。

本地詞庫

  • 首先在啟動的ES中對醉魚兩個字進(jìn)行分詞楚堤,IK默認(rèn)分為兩個漢字

    GET _analyze
    {
      "analyzer": "ik_max_word",
      "text": ["醉魚"]
    }
    

    結(jié)果如下

    {
      "tokens" : [
        {
          "token" : "醉",
          "start_offset" : 0,
          "end_offset" : 1,
          "type" : "CN_CHAR",
          "position" : 0
        },
        {
          "token" : "魚",
          "start_offset" : 1,
          "end_offset" : 2,
          "type" : "CN_CHAR",
          "position" : 1
        }
      ]
    }
    
    

    而我們的需求是讓其能分為一次詞語疫蔓,而不是兩個漢字,那么下面引入我們的自定義分詞文件

  • ESplugins/ik/config 目錄下創(chuàng)建自定義詞庫文件 zuiyu.dic,文件內(nèi)容如下,格式為一個詞語為一行淌哟。

    醉魚
    
  • 修改 IK 的配置,支持自定義分詞文件 拗小,修改plugins/ik/config 目錄下的IKAnalyzer.cfg.xml重罪,修改其中<entry key="ext_dict"></entry>的值樱哼,為本地文件路徑,配置為相對路徑剿配,直接填寫上一步創(chuàng)建的zuiyu.dic搅幅,結(jié)果如下

    <entry key="ext_dict">zuiyu.dic</entry>

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
    <properties>
      <comment>IK Analyzer 擴(kuò)展配置</comment>
      <!--用戶可以在這里配置自己的擴(kuò)展字典 -->
      <entry key="ext_dict">zuiyu.dic</entry>
       <!--用戶可以在這里配置自己的擴(kuò)展停止詞字典-->
      <entry key="ext_stopwords"></entry>
      <!--用戶可以在這里配置遠(yuǎn)程擴(kuò)展字典 -->
      <!--<entry key="remote_ext_dict"></entry>-->
      <!--用戶可以在這里配置遠(yuǎn)程擴(kuò)展停止詞字典-->
      <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
    </properties>
    
    
  • 如果是啟動的ES集群,需要復(fù)制當(dāng)前兩個文件到所有的集群中

    1呼胚、當(dāng)前集群有三個節(jié)點(diǎn)茄唐,其中都配置本地詞庫文件,但是node1蝇更,node2中都沒有增加醉魚這詞語沪编,只有node3有,此時使用分詞是無法達(dá)到預(yù)期效果的年扩。

    2蚁廓、node1中配置正常的<entry key="ext_dict">zuiyu.dic</entry>zuiyu.dic中也包含醉魚這個詞語厨幻。node2相嵌,node3都不配置ext_dict,此時當(dāng)前這個環(huán)境是可以進(jìn)行正確分詞况脆,達(dá)到預(yù)期的結(jié)果的饭宾。

  • 重啟 ES

  • 測試分詞效果,使用同樣的分詞語句

    GET _analyze
    {
      "analyzer": "ik_max_word",
      "text": ["醉魚"]
    }
    

    結(jié)果如下

    {
      "tokens" : [
        {
          "token" : "醉魚",
          "start_offset" : 0,
          "end_offset" : 2,
          "type" : "CN_WORD",
          "position" : 0
        }
      ]
    }
    

    一般來說格了,詞語肯定不是固定的看铆,隨著工作的長期積累,不斷地發(fā)現(xiàn)新的專業(yè)術(shù)語盛末,那么熱更新性湿,動態(tài)更新詞庫纬傲,不在每次更新詞庫之后重啟ES就是非常有必要的了,下面來看一下熱更新詞庫肤频。

遠(yuǎn)程詞庫(熱更新)

熱更新詞庫的區(qū)別就是IKAnalyzer.cfg.xml文件中的一個配置的問題叹括。不過核心還是需要一個詞庫文件,剛才是通過路徑訪問的宵荒,但是無法熱更新汁雷,所以現(xiàn)在需要改為URL訪問,也就是 HTTP 請求可以讀取到的形式报咳。一個詞語一行返回即可侠讯。

此處使用 Nginx 來做演示。Nginx 中的配置如下

  • nginx.conf

            location /dic/zuiyu.dic {
                alias   html/dic/zuiyu.dic;   
            }
    
  • zuiyu.dic 文件內(nèi)容如下

    醉魚
    
  • IKAnalyzer.cfg.xml配置修改如下,IP為部署的 NginxIP 暑刃,端口也是根據(jù)自己 Nginx 監(jiān)聽的端口修改

    <entry key="remote_ext_dict">http://192.168.30.240:8088/dic/zuiyu.dic</entry>
    

    完整的配置如下

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
    <properties>
      <comment>IK Analyzer 擴(kuò)展配置</comment>
      <!--用戶可以在這里配置自己的擴(kuò)展字典 -->
      <entry key="ext_dict">zuiyu.dic</entry>
       <!--用戶可以在這里配置自己的擴(kuò)展停止詞字典-->
      <entry key="ext_stopwords"></entry>
      <!--用戶可以在這里配置遠(yuǎn)程擴(kuò)展字典 -->
      <entry key="remote_ext_dict">http://192.168.30.240:8088/dic/zuiyu.dic</entry>
      <!--用戶可以在這里配置遠(yuǎn)程擴(kuò)展停止詞字典-->
      <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
    </properties>
    
    
  • 驗(yàn)證URL訪問結(jié)果厢漩,使用瀏覽器或者postman等工具訪問 http://192.168.30.240:8088/dic/zuiyu.dic 可以返回我們的文件內(nèi)容即可,也是一個詞語一行的形式岩臣。

  • 復(fù)制IKAnalyzer.cfg.xml 到集群的每個節(jié)點(diǎn)中

  • 重啟ES

  • 測試對 醉魚 分詞溜嗜,可以看到與上面本地詞庫時是同樣的效果

    {
      "tokens" : [
        {
          "token" : "醉魚",
          "start_offset" : 0,
          "end_offset" : 2,
          "type" : "CN_WORD",
          "position" : 0
        }
      ]
    }
    
  • 測試對我愛你醉魚進(jìn)行分詞

    GET _analyze
    {
      "analyzer": "ik_max_word",
      "text": ["我愛你醉魚"]
    }
    

    結(jié)果如下

    {
      "tokens" : [
        {
          "token" : "我愛你",
          "start_offset" : 0,
          "end_offset" : 3,
          "type" : "CN_WORD",
          "position" : 0
        },
        {
          "token" : "愛你",
          "start_offset" : 1,
          "end_offset" : 3,
          "type" : "CN_WORD",
          "position" : 1
        },
        {
          "token" : "醉魚",
          "start_offset" : 3,
          "end_offset" : 5,
          "type" : "CN_WORD",
          "position" : 2
        }
      ]
    }
    
  • zuiyu.dic中增加我愛你醉魚,最終的文件內(nèi)容如下

    醉魚
    我愛你醉魚
    
  • 增加完成之后架谎,這5個字已經(jīng)成為一個詞語炸宵,分詞結(jié)果如下

    {
      "tokens" : [
        {
          "token" : "我愛你醉魚",
          "start_offset" : 0,
          "end_offset" : 5,
          "type" : "CN_WORD",
          "position" : 0
        },
        {
          "token" : "我愛你",
          "start_offset" : 0,
          "end_offset" : 3,
          "type" : "CN_WORD",
          "position" : 1
        },
        {
          "token" : "愛你",
          "start_offset" : 1,
          "end_offset" : 3,
          "type" : "CN_WORD",
          "position" : 2
        },
        {
          "token" : "醉魚",
          "start_offset" : 3,
          "end_offset" : 5,
          "type" : "CN_WORD",
          "position" : 3
        }
      ]
    }
    

    僅在一個節(jié)點(diǎn) node1 中配置了遠(yuǎn)程詞庫,node2node3 都沒有配置任何的詞庫谷扣,此時當(dāng)前環(huán)境無法達(dá)到我們的預(yù)期分詞效果

總結(jié)

通過上面我們的試驗(yàn)土全,可以發(fā)現(xiàn)結(jié)合 IK分詞器,使用自定義詞庫会涎,可以滿足我們專業(yè)內(nèi)的詞語分詞裹匙,實(shí)現(xiàn)更好的分詞效果,再加上動態(tài)詞庫的更新末秃,對我們的工作還是很有必要的概页,配置過程是不是很簡單,下面就趕緊用起來吧蛔溃。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末绰沥,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子贺待,更是在濱河造成了極大的恐慌徽曲,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件麸塞,死亡現(xiàn)場離奇詭異秃臣,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門奥此,熙熙樓的掌柜王于貴愁眉苦臉地迎上來弧哎,“玉大人,你說我怎么就攤上這事稚虎〕纺郏” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵蠢终,是天一觀的道長序攘。 經(jīng)常有香客問我,道長寻拂,這世上最難降的妖魔是什么程奠? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮祭钉,結(jié)果婚禮上瞄沙,老公的妹妹穿的比我還像新娘。我一直安慰自己慌核,他們只是感情好距境,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著遂铡,像睡著了一般肮疗。 火紅的嫁衣襯著肌膚如雪晶姊。 梳的紋絲不亂的頭發(fā)上扒接,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天,我揣著相機(jī)與錄音们衙,去河邊找鬼钾怔。 笑死,一個胖子當(dāng)著我的面吹牛蒙挑,可吹牛的內(nèi)容都是我干的宗侦。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼忆蚀,長吁一口氣:“原來是場噩夢啊……” “哼矾利!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起馋袜,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤男旗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后欣鳖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體察皇,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了什荣。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片矾缓。...
    茶點(diǎn)故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖稻爬,靈堂內(nèi)的尸體忽然破棺而出嗜闻,到底是詐尸還是另有隱情,我是刑警寧澤桅锄,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布泞辐,位于F島的核電站,受9級特大地震影響竞滓,放射性物質(zhì)發(fā)生泄漏咐吼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一商佑、第九天 我趴在偏房一處隱蔽的房頂上張望锯茄。 院中可真熱鬧,春花似錦茶没、人聲如沸肌幽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽喂急。三九已至,卻和暖如春笛求,著一層夾襖步出監(jiān)牢的瞬間廊移,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工探入, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留狡孔,地道東北人。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓蜂嗽,卻偏偏與公主長得像苗膝,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子植旧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內(nèi)容