1. 程式人生 > >Elasticsearch中文分詞研究

Elasticsearch中文分詞研究

一、ES分析器簡介


ES是一個實時搜尋與資料分析引擎,為了完成搜尋功能,必須對原始資料進行分析、拆解,以建立索引,從而實現搜尋功能;


ES對資料分析、拆解過程如下:




首先,將一塊文字分成適合於倒排索引的獨立的 詞條;
之後,將這些詞條統一化為標準格式以提高它們的“可搜尋性”,或者 recall




實際執行上面分析工作的,既是ES的分析器;


ES 分析器實際包含三部分功能:


1.字元過濾器:


字元過濾器是用來整理一個尚未被分詞的字串。例如:如果我們的文字那是HTML格式的,他會包含像<p>或者<div>這樣的HTML標籤,這些標籤是我們不想索引的,我們可以使用html清除這個字元過濾器來移除所有的HTML標籤,並且像把Á轉換為相對應的Unicode字元Á這樣,轉換HTML實體。


一個分析器可以有0或多個字元過濾器。


2.分詞器:


一個分析器必須有一個唯一的分詞器。分詞器把字串分解成單個詞條或者詞彙單元。比如空格分詞器會把字串按空格來切分成詞單元:如字串“The 2 QUICK Brown-Foxes jumped over the lazy dog's bone.”經過空格分詞器分詞後,會變為如下詞單元【The, 2, QUICK, Brown-Foxes, jumped, over, the, lazy, dog's, bone.】


3.詞單元過濾器:


經過分詞,作為結果的 ‘詞單元流’ 會按照指定的順序通過指定的詞單元過濾器。詞單元過濾器可以修改、新增或者移詞單元。比如lowercase語彙單元過濾器,會轉換所有的語彙單元為小寫:如詞單元“We”經過lowercase語彙單元過濾器過濾後,會變為“we”。




二、ES中文分析器


ES內建了一些分析器,其中支援對中文進行分詞的分析器有:




StandardAnalyzer:單字分析器 - 支援中文分詞,但只是按照單個的漢字進行了分詞,如“我是中國人”,分詞後,詞單元為【“我”  “是”  “中”  “國”  “人”】
CJKAnalyzer:二分法分析器 - 按照兩個兩個一組的形式對漢字進行了分詞,如“我是中國人”,分詞後,詞單元為【“我是”  “是中”  “中國”  “國人”】




從上面可以看出,這兩個分析器其實對中文的分詞都不夠理想,對此,ES推薦了一款對亞洲語言特別好用的分析器:ICU 分析器;然而對中文分詞來說,最有效的分析器是IK分析器,IK分析器採用詞庫分詞方法,即按某種演算法構造詞,然後去匹配已建好的詞庫集合,如果匹配到就切分出來成為詞語,詞庫分詞法是目前被認為最理想的中文分詞演算法。




三、IK分析器


IK分析器官網:https://github.com/medcl/elasticsearch-analysis-ik


從官網可以瞭解到,目前IK分析器有兩款:ik_max_word 和 ik_smart:




ik_max_word: 會將文字做最細粒度的拆分,比如會將“中華人民共和國國歌”拆分為“中華人民共和國,中華人民,中華,華人,人民共和國,人民,人,民,共和國,共和,和,國國,國歌”,會窮盡各種可能的組合;
ik_smart: 會做最粗粒度的拆分,比如會將“中華人民共和國國歌”拆分為“中華人民共和國,國歌”。






四、IK分析器搭建


搭建elasticsearch-analysis-ik


ElasticSearch版本:6.2.3,是否叢集:否,伺服器: 192.168.9.214


安裝過程:




安裝ElasticSearch
安裝ElasticSearch外掛elasticsearch-analysis-ik




# 切換到www賬號,ES不能使用root賬號啟動,否則會報錯
su - www


# 下載ElasticSearch
cd /usr/local/elk
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.3.zip
unzip elasticsearch-6.2.3.zip


# 啟動ES
cd /usr/local/elk/elasticsearch-6.2.3
bin/elasticsearch -d


##########################################
# 安裝elasticsearch-analysis-ik(方式1)
##########################################


# 使用`bin/elasticsearch-plugin install`命令安裝
cd /usr/local/elk/elasticsearch-6.2.3
bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.2.3/elasticsearch-analysis-ik-6.2.3.zip


# 重啟ES(此處較為血腥,生產環境勿用)
killall java
bin/elasticsearch -d


##########################################
# 安裝elasticsearch-analysis-ik(方式2) -- 實踐可行
##########################################


# 下載
cd /usr/local/elk/elasticsearch-6.2.3/plugins
wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.2.3/elasticsearch-analysis-ik-6.2.3.zip
upzip elasticsearch-analysis-ik-6.2.3.zip && rm -rf elasticsearch-analysis-ik-6.2.3.zip


# 重啟ES(此處較為血腥,生產環境勿用)
killall java
bin/elasticsearch -d




五、IK分析器應用


待補充




附:參考資料

- [ES分析器](https://www.elastic.co/guide/cn/elasticsearch/guide/current/analysis-intro.html)
- [ES自定義分析器](https://www.elastic.co/guide/cn/elasticsearch/guide/current/custom-analyzers.html)
- [ES配置分析器](https://www.elastic.co/guide/cn/elasticsearch/guide/current/configuring-analyzers.html)
- [ES標準分詞器](https://www.elastic.co/guide/cn/elasticsearch/guide/current/standard-tokenizer.html)
- [ICU簡介](https://www.elastic.co/guide/cn/elasticsearch/guide/current/icu-plugin.html)
- [ICU分詞器](https://www.elastic.co/guide/cn/elasticsearch/guide/current/icu-tokenizer.html)

- [什麼是倒排索引](http://www.cnblogs.com/zlslch/p/6440114.html)

附一:ElasticSearch 與 solr 對比

- [搜尋引擎選型調研文件](https://www.cnblogs.com/chowmin/articles/4629220.html)


- [ElasticSearch vs Solr多維度分析對比](https://blog.csdn.net/gaowenhui2008/article/details/78189627)

附二:ElasticSearch能否替換資料庫

問題提出


使用ES做搜尋引擎,資料需要向ES輸入一份,ES接收到資料後,會對資料建立索引,同時會存下完整的資料資訊;


使用者通過ES搜尋時,是檢索的ES的索引,資料也是直接從ES中取得,不需要到資料庫中再取一遍,所以感覺有些場景下,資料庫好像沒必要存在,有ES就可以了。




分析


待完善


沒有花時間具體分析比較,大概就是:


ES作為主資料庫時,在訪問控制和資料汙染控制方面,不如專門的DB;另外ES是分散式儲存,資料是分散的,進行關聯性操作時,會很麻煩(但是可以實現);


如果能夠容忍上面的問題,使用ES做主資料庫,理論上是沒有問題的;


參考了一篇詳細分析ES和NoSql的文章:[ElasticSearch學習4_把 ElasticSearch 當成是 NoSQL 資料庫](https://blog.csdn.net/wang_zhenwei/article/details/50177171),比較推薦的做法是:“Elasticsearch通常被用作其它資料庫的補充。那樣的資料庫系統要有強大的資料約束保證、容錯性和魯棒性、高可用性和帶事務支援的資料更新能力,它維護著核心資料 - 這些資料隨後會被非同步推送到Elasticsearch中去(也可能是抽取,前提是你使用了Elasticsearch的某一種“rivers”)”






### 參考


- [ES官方 - Elasticsearch as a NoSQL Database](https://www.elastic.co/blog/found-elasticsearch-as-nosql)
- [ES官方 - NoSQL, Yes Search](https://www.elastic.co/blog/no-sql-yes-search)
- [ElasticSearch學習4_把 ElasticSearch 當成是 NoSQL 資料庫](https://blog.csdn.net/wang_zhenwei/article/details/50177171)
- [elasticsearch(lucene)可以代替NoSQL(mongodb)嗎?](https://www.zhihu.com/question/25535889)
- [ElasticSearch 和 Mysql 配合使用的話,同一份資料是不是必須在 ElasticSearch 和 Mysql 各存一份?](https://ruby-china.org/topics/25606?locale=en)
- [elasticsearch 可以替代資料庫嗎](https://zhidao.baidu.com/question/1434259038397205099.html)
- [可否完全使用ElasticSearch代替資料庫儲存?](https://www.zhihu.com/question/45510463?sort=created)
- [Elasticsearch為什麼不適合做資料庫](https://elasticsearch.cn/question/2139)
- [Elasticsearch關聯關係處理](https://www.elastic.co/guide/cn/elasticsearch/guide/current/relations.html)
- [談談Elasticsearch 和 傳統關係型資料庫的對比](http://f.dataguru.cn/thread-607540-1-1.html)
- [elasticsearch可以代替NoSQL嗎](https://zhidao.baidu.com/question/1863108917081182747.html)
- [Elasticsearch、MongoDB和Hadoop比較](https://www.jianshu.com/p/2c7b0c76fa04)