這篇博客主要講:分詞器概念
、ES內置分詞器
、ES中文分詞器
。html
Analysis
: 文本分析是把全文本轉換一系列單詞(term/token)的過程,也叫分詞。Analysis是經過Analyzer來實現的。git
當一個文檔被索引時,每一個Field均可能會建立一個倒排索引(Mapping能夠設置不索引該Field)。github
倒排索引的過程就是將文檔經過Analyzer分紅一個一個的Term,每個Term都指向包含這個Term的文檔集合。正則表達式
當查詢query時,Elasticsearch會根據搜索類型決定是否對query進行analyze,而後和倒排索引中的term進行相關性查詢,匹配相應的文檔。算法
分析器(analyzer)都由三種構件塊組成的:character filters
, tokenizers
, token filters
。數組
1) character filter 字符過濾器
app
在一段文本進行分詞以前,先進行預處理,好比說最多見的就是,過濾html標籤(<span>hello<span> --> hello),& --> and(I&you --> I and you)
2) tokenizers 分詞器
機器學習
英文分詞能夠根據空格將單詞分開,中文分詞比較複雜,能夠採用機器學習算法來分詞。elasticsearch
3) Token filters Token過濾器
ide
將切分的單詞進行加工。大小寫轉換(例將「Quick」轉爲小寫),去掉詞(例如停用詞像「a」、「and」、「the」等等),或者增長詞(例如同義詞像「jump」和「leap」)。
三者順序
:Character Filters--->Tokenizer--->Token Filter
三者個數
:analyzer = CharFilters(0個或多個) + Tokenizer(剛好一個) + TokenFilters(0個或多個)
Standard Analyzer - 默認分詞器,按詞切分,小寫處理
Simple Analyzer - 按照非字母切分(符號被過濾), 小寫處理
Stop Analyzer - 小寫處理,停用詞過濾(the,a,is)
Whitespace Analyzer - 按照空格切分,不轉小寫
Keyword Analyzer - 不分詞,直接將輸入看成輸出
Patter Analyzer - 正則表達式,默認\W+(非字符分割)
Language - 提供了30多種常見語言的分詞器
Customer Analyzer 自定義分詞器
PUT new_index { "settings": { "analysis": { "analyzer": { "std_folded": { "type": "custom", "tokenizer": "standard", "filter": [ "lowercase", "asciifolding" ] } } } }, "mappings": { "properties": { "title": { "type": "text", "analyzer": "std_folded" #指定分詞器 }, "content": { "type": "text", "analyzer": "whitespace" #指定分詞器 } } } }
這裏講解下常見的幾個分詞器:Standard Analyzer
、Simple Analyzer
、whitespace Analyzer
。
1)示例
standard 是默認的分析器。它提供了基於語法的標記化(基於Unicode文本分割算法),適用於大多數語言
POST _analyze { "analyzer": "standard", "text": "Like X 國慶放假的" }
運行結果
2)配置
標準分析器接受下列參數:
_english_
或 包含中止詞列表的數組,默認是 _none_
PUT new_index { "settings": { "analysis": { "analyzer": { "my_english_analyzer": { "type": "standard", #設置分詞器爲standard "max_token_length": 5, #設置分詞最大爲5 "stopwords": "_english_" #設置過濾詞 } } } } }
simple 分析器當它遇到只要不是字母的字符,就將文本解析成term,並且全部的term都是小寫的。
POST _analyze { "analyzer": "simple", "text": "Like X 國慶放假 的" }
運行結果
POST _analyze { "analyzer": "whitespace", "text": "Like X 國慶放假 的" }
返回
中文的分詞器如今你們比較推薦的就是 IK分詞器
,固然也有些其它的好比 smartCN、HanLP。
這裏只講如何使用IK作爲中文分詞。
開源分詞器 Ik 的github:https://github.com/medcl/elasticsearch-analysis-ik
注意
IK分詞器的版本要你安裝ES的版本一致,我這邊是7.1.0那麼就在github找到對應版本,而後啓動命令
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.1.0/elasticsearch-analysis-ik-7.1.0.zip
運行結果
注意
安裝完插件後需重啓Es,才能生效。
IK有兩種顆粒度的拆分:
ik_smart
: 會作最粗粒度的拆分
ik_max_word
: 會將文本作最細粒度的拆分
1) ik_smart 拆分
GET /_analyze { "text":"中華人民共和國國徽", "analyzer":"ik_smart" }
運行結果
2)ik_max_word 拆分
GET /_analyze { "text":"中華人民共和國國徽", "analyzer":"ik_max_word" }
運行結果
三、Elasticsearch拼音分詞和IK分詞的安裝及使用
我相信,不管從此的道路多麼坎坷,只要抓住今天,早晚會在奮鬥中嚐到人生的甘甜。抓住人生中的一分一秒,賽過虛度中的一月一年!(15)