7、ElasticSearch 索引及分詞


 

正排索引
倒排索引
索引模塊組成部分
索引過程
停用詞
中文分詞器
常見的中文分詞器
集成IK中文分詞插件
自定義IK詞庫
熱更新IK詞庫

 

正排索引

由文檔去找關鍵詞

 

倒排索引

由關鍵詞 去找文檔

倒排索引:保留關鍵詞及對應文檔的對應關系

 

索引模塊 組成部分
索引分析模塊 (通過注冊分詞器來配置:從文檔中提取若干關鍵詞)

分解器
詞源過濾器
索引建立模塊Indexer

在建立索引過程中,分析處理過的文檔將被加入到索引列表。事實上,Lucene為此僅通過了一個非常簡單的API,而后自行內生地完成。



文檔集合---> 預處理(字符過濾器 charater filter)--->文檔集合---> Tokenizer
--->Token集合--->Token Filter ---> Token集合 ---> Index

 

 

索引過程

 

停用詞
有些詞在文本中出現的頻率非常高,但是對文本所攜帶的信息基本去產生影響,這些詞就稱之為停用詞。


http://www.ranks.nl/stopwords/chinese-stopwords
http://www.ranks.nl/stopwords

用法:
  文本經過分詞之后,停用詞通常被過濾掉,不會進行索引
  在檢索的時候,用戶的查詢中如果含有停用詞,檢索系統也會將其過濾掉
優點:
  排除停用詞可以加快建立索引的所讀,減小索引庫文件的大小

 

中文分詞器

 

單字分詞
二分法分詞
詞庫分詞
  按某種算法構造詞,然后去匹配已建好的詞庫集合,如果匹配到就切分出來為詞語。通常詞庫分詞被認為是最理想的中文分詞算法。

 

常見的中文分詞器

 

StandardAnzlyzer   單字分詞
CJKAnalyzer  二分法
IKAnalyzer   詞庫分詞

測試默認的分詞器對中文的支持(單字分詞)
curl -H "Content-Type: application/json" -XGET 'http://192.168.81.131:9200/_analyze?pretty=true' -d'{"text":"我們是中國人"}'
{
  "tokens" : [
    {
      "token" : "",
      "start_offset" : 0,
      "end_offset" : 1,
      "type" : "<IDEOGRAPHIC>",
      "position" : 0
    },
    {
      "token" : "",
      "start_offset" : 1,
      "end_offset" : 2,
      "type" : "<IDEOGRAPHIC>",
      "position" : 1
    },
    {
      "token" : "",
      "start_offset" : 2,
      "end_offset" : 3,
      "type" : "<IDEOGRAPHIC>",
      "position" : 2
    },
    {
      "token" : "",
      "start_offset" : 3,
      "end_offset" : 4,
      "type" : "<IDEOGRAPHIC>",
      "position" : 3
    },
    {
      "token" : "",
      "start_offset" : 4,
      "end_offset" : 5,
      "type" : "<IDEOGRAPHIC>",
      "position" : 4
    },
    {
      "token" : "",
      "start_offset" : 5,
      "end_offset" : 6,
      "type" : "<IDEOGRAPHIC>",
      "position" : 5
    }
  ]
}

 

集成IK中文分詞插件

 http://mirror.bit.edu.cn/apache/maven/maven-3/3.6.1/binaries/apache-maven-3.6.1-bin.tar.gz

yum install maven
https://github.com/medcl/elasticsearch-analysis-ik.git

<mirrors> <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror> </mirrors>

 

1、下載es的ik插件
  https://github.com/medcl/elasticsearch-analysis-ik
  使用maven對下載的插件進行源碼編譯 (提前安裝maven)
  mvn clean package -DskipTests
2、拷貝和解壓release下的文件: target/releases/elasticsearch-analysis-ik-*.zip到你的elasticsearch插件目錄。
  ES_HOME/plugins/ik
  
3、重啟es服務
4、測試分詞效果

curl -H "Content-Type: application/json" -XGET 'http://192.168.81.131:9200/_analyze?pretty=true' -d'{"analyzer":"ik_max_word","text":"我們是中國人"}'
curl -H "Content-Type: application/json" -XGET 'http://192.168.81.131:9200/_analyze?pretty=true' -d'{"analyzer":"ik_smart","text":"我們是中國人"}'
 [INFO ][o.e.p.PluginsService     ] [pz_l3tP] loaded plugin [analysis-ik]

 

錯誤信息
Plugin [analysis-ik] was built for Elasticsearch version 6.5.0 but version 6.7.1 is running
編輯插件內的  plugin-descriptor.properties 文件中的版本號
[root@localhost plugins]# curl -H "Content-Type: application/json" -XGET 'http://192.168.81.131:9200/_analyze?pretty=true' -d'{"analyzer":"ik_max_word","text":"我們是中國人"}'
{
  "tokens" : [
    {
      "token" : "我們",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "CN_WORD",
      "position" : 0
    },
    {
      "token" : "",
      "start_offset" : 2,
      "end_offset" : 3,
      "type" : "CN_CHAR",
      "position" : 1
    },
    {
      "token" : "中國人",
      "start_offset" : 3,
      "end_offset" : 6,
      "type" : "CN_WORD",
      "position" : 2
    },
    {
      "token" : "中國",
      "start_offset" : 3,
      "end_offset" : 5,
      "type" : "CN_WORD",
      "position" : 3
    },
    {
      "token" : "國人",
      "start_offset" : 4,
      "end_offset" : 6,
      "type" : "CN_WORD",
      "position" : 4
    }
  ]
}

 

自定義IK詞庫

 

首先在ik插件的config/custom(自己創建)目錄下創建一個test.dic文件,在文件中添加詞語即可,每個詞語一行

修改ik配置文件/usr/local/elasticsearch-6.6.1/plugins/ik/config/IKAnalyzer.cfg.xml
  <entry key="ext_dict">custom/test.dic</entry>

重啟es服務
測試效果
[root@localhost config]# cat /usr/local/elasticsearch-6.6.1/plugins/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>

 

 

熱更新IK詞庫
不用每次更新詞庫,都要重啟

一、部署http服務,安裝Tomact
  1、切換到apache-tomact-7.0.67/webapps/ROOT
  2、新建熱詞文件
    vim hot.dic
    ****
  3、需正常訪問
  bin/startup.sh # 開啟Tomact, 使用nginx也一樣
  http://192.168.81.131:8080/hot.dic
二、修改ik插件的配置文件
  1、vim config/IKAnalyzer.cfg.xml
    添加如下內容
    <entry key="remote_ext_dict">http://192.168.81.131:8080/hot.dic</entry>
    分發修改后的配置到其他es節點
  2、重啟es,可以看到加載熱詞庫
  3、測試動態添加熱詞
    對比動態添加熱詞
    curl -H "Content-Type: application/json" -XGET 'http://192.168.81.131:9200/_analyze?pretty=true' -d'{"analyzer":"ik_smart","text":"老司機"}'
 

 

 

 


免責聲明!

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



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