- Analysis - 文字分析是吧全文字轉換成一系列的單詞(term / token)的過程,也叫分詞
- Analysis 是通過Analyzer來實現的
- 可使用Elasticesearch 內建的分析器 或者按需求定製化分析器
- 除了在資料寫入時轉換詞條,匹配Query語句時候也需要用相同的分析器會查詢語句進行分析
Analyzer 的組成
- 分詞器是專門處理分詞的元件,Analyzer 由三部分組成
- Character Filters (針對原始文字處理,例如去除html)
- Tokenizer(按照規則切分為單詞)
- Token Filter (將切分的單詞進行加工,小寫,刪除stopwords,增加同義語)
Elastocsearch 的內建分詞器
- Standard Analyzer - 預設分詞器,按詞切分,小寫處理
- Simple Analyzer - 按照非字母切分(符號被過濾),小寫處理
- Stop Analyzer - 小寫處理,停用詞過濾(the ,a,is)
- Whitespace Analyzer - 按照空格切分,不轉小寫
- Keyword Analyzer - 不分詞,直接將輸入當做輸出
- Patter Analyzer - 正規表示式,預設 \W+
- Language - 提供了30多種常見語言的分詞器
- Customer Analyzer 自定義分詞器
使用 _analyzer Api
- 直接指定Analyzer 進行測試
GET _analyze { "analyzer": "standard", "text" : "Mastering Elasticsearch , elasticsearch in Action" } //返回結果 { "tokens" : [ { "token" : "mastering", "start_offset" : 0, "end_offset" : 9, "type" : "<ALPHANUM>", "position" : 0 }, { "token" : "elasticsearch", "start_offset" : 10, "end_offset" : 23, "type" : "<ALPHANUM>", "position" : 1 }, { "token" : "elasticsearch", "start_offset" : 26, "end_offset" : 39, "type" : "<ALPHANUM>", "position" : 2 }, { "token" : "in", "start_offset" : 40, "end_offset" : 42, "type" : "<ALPHANUM>", "position" : 3 }, { "token" : "action", "start_offset" : 43, "end_offset" : 49, "type" : "<ALPHANUM>", "position" : 4 } ] }
-
指定索引的欄位進行測試
POST books/_analyze { "field": "title", "text": "Mastering Elasticesearch" }
-
自定義分詞進行測試
POST /_analyze { "tokenizer": "standard", "filter": ["lowercase"], "text": "Mastering Elasticesearch" } //結果返回 { "tokens" : [ { "token" : "mastering", "start_offset" : 0, "end_offset" : 9, "type" : "<ALPHANUM>", "position" : 0 }, { "token" : "elasticesearch", "start_offset" : 10, "end_offset" : 24, "type" : "<ALPHANUM>", "position" : 1 } ] }
Standard Analyzer
- 預設的分詞器
- 按詞切分
- 小寫處理
#standard GET _analyze { "analyzer": "standard", "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening." }
Simple Analyzer
- 按照非字母切分,非字母的都被去除
- 小寫處理
#simple 去除非字母的 :2 - xi GET _analyze { "analyzer": "simple", "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening." }
Whitespace Analyzer
- 空格切分
#stop GET _analyze { "analyzer": "whitespace", "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening." }
Stop Analyzer
- 相比 Simple Analyzer
- 多了stop filter
- 後把 the ,a, is,in 等修飾性詞語去除
GET _analyze { "analyzer": "stop", "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening." }
- 後把 the ,a, is,in 等修飾性詞語去除
Keyword Analyzer
- 不分詞,直接將輸入當作一個term輸出
#keyword GET _analyze { "analyzer": "keyword", "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening." }
Pattern Analyzer
- 通過正則表達進行分詞
- 預設是\W+,非字元的符號進行分隔
GET _analyze { "analyzer": "pattern", "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening." }
Language Analyzer
- 各國語言分詞
#english GET _analyze { "analyzer": "english", "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening." }
中文分詞的難點
- 中文句子,切分成一個一個次(不是一個個字)
- 英文中,單詞有自然的空格作為分隔
- 一句中文,在不同的上下文,有不同的理解
- 這個蘋果,不大好吃 / 這個蘋果,不大,好吃!
- 一些例子
- 他說的確實在理 / 這事的確定不下來
ICU Analyzer
- 需要安裝plugin
- Elasticsearch-plugin install analysis
- 提過了Unicode的支援,更好的支援亞洲語言!
給docker-compose安裝的es安裝外掛
cd /var/docker/docker-es-7.3/
docker exec -it es7_01 bash
bin/elasticsearch-plugin install analysis-icu
exit
docker exec -it es7_02 bash
bin/elasticsearch-plugin install analysis-icu
exit
docker-compose restart
#icu analyzer
POST _analyze
{
"analyzer": "icu_analyzer",
"text": "他說的確實在理”"
}
更多的中文分詞器
- IK
- 支援自定義詞庫,支援熱更新分詞字典
- https://github.com/medcl/elasticsearch-ana...
- THULAC
- THU Lexucal Analyzer for Chinese,清華大學自然語言處理和社會人文計算實驗室的一套中文分詞器
- https://github.com/microbun/elasticearch-t...