1. 程式人生 > >Elasticsearch-IK分詞器詳解以及原始碼修改實現mysql熱更新

Elasticsearch-IK分詞器詳解以及原始碼修改實現mysql熱更新

  • IK分詞器的安裝和使用
    訪問ik分詞器github專案地址:https://github.com/medcl/elasticsearch-analysis-ik
    1.在本地clone專案程式碼,git clone https://github.com/medcl/elasticsearch-analysis-ik.git
    2.切換到對應本地elasticsearch版本號的tag,git checkout tags/5.5.2
    3.通過maven進行專案打包,mvn package
    4.拷貝/target/release/xxx.zip到/es/plugins/ik下面並解壓出來(注意層級關係,ik目錄下直接是解壓後的所有檔案,不能夠再有資料夾目錄)
    5.重啟elasticsearch服務未報錯即可

IK分詞器有兩種Analyzer: ik_smart , ik_max_word,前者會做粗粒度的拆分,後者會做細粒度的儘可能多的拆分,一般使用後者來進行對中文的分詞處理

  • IK分詞器的使用
PUT /my_index
{
  "mappings": {
    "my_type": {
      "properties": {
        "text":{
          "type": "text",
          "analyzer": "ik_max_word"
        }
      }
    }
  }
}
GET /_analyze
{
  "text"
:"你好 我來自深圳市 正在學習搜尋技術", "analyzer": "ik_max_word" }

結果可以看到被分成了很多個詞

  • IK分詞器配置檔案詳解以及自定義詞庫
    • 找到ik/config目錄下IKAnalyzer.cfg.xml檔案,用來配置自定義詞庫
    • main.dic是原生詞庫總共27萬,只要是這些詞,都會被分詞在一起
    • quantifier.dic是一些單位的相關詞
    • suffix.dic是一些地方相關的字尾
    • surname.dic是一些姓相關的詞
    • stopword.dic是英文停用詞

最重要的配置是main.dic和stopword.dic

自定義詞庫:
修改IKAnalyzer.cfg.xml配置檔案,配置自定義擴充套件詞庫和停詞詞庫:

<properties>
    <comment>IK Analyzer 擴充套件配置</comment>
    <!--使用者可以在這裡配置自己的擴充套件字典 -->
    <entry key="ext_dict">custom/mydict.dic</entry>
     <!--使用者可以在這裡配置自己的擴充套件停止詞字典-->
    <entry key="ext_stopwords">custom/ext_sotpword.dic</entry>
    <!--使用者可以在這裡配置遠端擴充套件字典 -->
    <!-- <entry key="remote_ext_dict">words_location</entry> -->
    <!--使用者可以在這裡配置遠端擴充套件停止詞字典-->
    <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>

在custom/mydict.dic和custom/ext_sotpword.dic下新增自定義的停用詞然後重啟es

➜  config cat mydict.dic 
網紅
藍瘦香菇
鬼畜

新增以上自定義詞語,然後再進行分詞測試

GET /my_index/_analyze
{
  "text":"藍瘦香菇 ",
  "analyzer": "ik_max_word"
}
返回
{
  "tokens": [
    {
      "token": "藍瘦香菇",
      "start_offset": 0,
      "end_offset": 4,
      "type": "CN_WORD",
      "position": 0
    },
    {
      "token": "香菇",
      "start_offset": 2,
      "end_offset": 4,
      "type": "CN_WORD",
      "position": 1
    }
  ]
}
  • 修改IK分詞器原始碼來基於mysql熱更新詞庫
    對於分散式的es叢集,不可能去每個節點手動新增自定義的詞語,還要保證不停機
    兩種熱更新的方案:
    • 1.修改ik分詞器原始碼,然後手動支援從mysql中每隔一定時間,自動載入新的詞庫
    • 2.基於ik分詞器原生支援的熱更新方案,部署一個web伺服器,提供一個http介面,通過modified和tag響應頭,來提供詞語的熱更新

通常會採用第一種方案,對於第二種官方也不推薦,因為不太穩定

修改原始碼步驟如下:
1、下載原始碼

ik分詞器,是個標準的java maven工程,直接匯入eclipse就可以看到原始碼

2、修改原始碼

Dictionary類,169行:Dictionary單例類的初始化方法,在這裡需要建立一個我們自定義的執行緒,並且啟動它
HotDictReloadThread類:就是死迴圈,不斷呼叫Dictionary.getSingleton().reLoadMainDict(),去重新載入詞典
Dictionary類,389行:this.loadMySQLExtDict();
Dictionary類,683行:this.loadMySQLStopwordDict();

3、mvn package打包程式碼

target\releases\elasticsearch-analysis-ik-5.2.0.zip

4、解壓縮ik壓縮包

將mysql驅動jar,放入ik的目錄下

5、修改jdbc相關配置

6、重啟es

觀察日誌,日誌中就會顯示我們列印的那些東西,比如載入了什麼配置,載入了什麼詞語,什麼停用詞

7、在mysql中新增詞庫與停用詞

8、分詞實驗,驗證熱更新生效