正排索引
倒排索引
索引模塊組成部分
索引過程
停用詞
中文分詞器
常見的中文分詞器
集成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":"老司機"}'

