IK分詞器的使用


六、IK分詞器的使用

之前已經介紹了IK分詞器的下載和安裝,下面就來驗證一下:

GET _analyze
{
  "analyzer": "ik_max_word",
  "text": "上海自來水來自海上"
}

如果返回如下數據就說明安裝成功了:
image

1 ik_max_word

ik_max_word參數會將文檔做最細粒度的拆分,會窮盡各種可能的組合。

PUT ik1
{
  "mappings": {
    "properties":{
      "title":{
        "type":"text",
        "analyzer": "ik_max_word"
      }
    }
  }
}

我們創建一個索引名為ik1,指定使用ik_max_word分詞器,然后插入幾條數據:

PUT ik1/_doc/1
{
  "content":"真開心今天吃了三頓飯"
}
PUT ik1/_doc/2
{
  "content":"今天你也在煩惱嗎?笑一笑吧"
}
PUT ik1/_doc/3
{
  "content":"愛笑的人運氣都不會太差"
}

現在讓我們開始查詢:

GET ik1/_search
{
  "query": {
    "match": {
      "content": "今天"
    }
  }
}

GET ik1/_search
{
  "query": {
    "match": {
      "content": "笑"
    }
  }
}

2 ik_smart

ik_smart是另一種分詞方式,它將文檔作粗粒度的拆分。比如,愛笑的人運氣都不會太差這句話:

  • ik_max_word會拆分為:愛笑,的人,運氣,都不會,都不,不會,太差
  • ik_smart會拆分為:愛笑,的人,運氣,都不會,太差

由上面的對比可以發現,兩個參數的不同,所以查詢結果也肯定不一樣,視情況而定用什么粒度。

至於查詢,與之前介紹的查詢方法完全一樣。

3 ik目錄簡介

ik/config目錄下有ik分詞配置文件:

  • IKAnalyzer.cfg.xml,用來配置自定義的詞庫
  • main.dic,ik原生內置的中文詞庫,只要是這些單詞,都會被分在一起。
  • surname.dic,中國的姓氏。
  • suffix.dic,特殊(后綴)名詞,例如鄉、江、所、省等等。
  • preposition.dic,中文介詞,例如不、也、了、仍等等。
  • stopword.dic,英文停用詞庫,例如a、an、and、the等。
  • quantifier.dic,單位名詞,如厘米、件、倍、像素等。
  • extra開頭的文件,是額外的詞庫。
    image

4 擴展詞庫

ik/config目錄下的IKAnalyzer.cfg.xml中可以擴展詞庫:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
	<comment>IK Analyzer 擴展配置</comment>
	<!--用戶可以在這里配置自己的擴展字典 -->
	<entry key="ext_dict"></entry>
	 <!--用戶可以在這里配置自己的擴展停止詞字典-->
	<entry key="ext_stopwords"></entry>
	<!--用戶可以在這里配置遠程擴展字典 -->
	<!-- <entry key="remote_ext_dict">words_location</entry> -->
	<!--用戶可以在這里配置遠程擴展停止詞字典-->
	<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>

比如我們添加一個詞典,在config目錄下新建一個new.dic

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

然后重啟es,再使用分詞器試試:

GET _analyze
{
  "analyzer": "ik_smart",
  "text": "奧利給干了兄弟們"
}

image

注意詞庫的編碼必須是utf-8

IK插件還支持熱更新,在配置文件中的如下配置

	<!--用戶可以在這里配置遠程擴展字典 -->
	<!-- <entry key="remote_ext_dict">words_location</entry> -->
	<!--用戶可以在這里配置遠程擴展停止詞字典-->
	<!-- <entry key="remote_ext_stopwords">words_location</entry> -->

其中 words_location 是指一個 url,比如 http://yoursite.com/getCustomDict,該請求只需滿足以下兩點即可完成分詞熱更新。

  1. 該 http 請求需要返回兩個頭部(header),一個是 Last-Modified,一個是 ETag,這兩者都是字符串類型,只要有一個發生變化,該插件就會去抓取新的分詞進而更新詞庫。
  2. 該 http 請求返回的內容格式是一行一個分詞,換行符用 \n 即可。

滿足上面兩點要求就可以實現熱更新分詞了,不需要重啟es 。

可以將需自動更新的熱詞放在一個 UTF-8 編碼的 .txt 文件里,放在 nginx 或其他簡易 http server 下,當 .txt 文件修改時,http server 會在客戶端請求該文件時自動返回相應的 Last-Modified 和 ETag。可以另外做一個工具來從業務系統提取相關詞匯,並更新這個 .txt文件。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM