Elasticsearch(10) --- 內置分詞器、中文分詞器
這篇博客主要講:分詞器概念、ES內置分詞器、ES中文分詞器。
一、分詞器概念
1、Analysis 和 Analyzer
Analysis: 文本分析是把全文本轉換一系列單詞(term/token)的過程,也叫分詞。Analysis是通過Analyzer來實現的。
當一個文檔被索引時,每個Field都可能會創建一個倒排索引(Mapping可以設置不索引該Field)。
倒排索引的過程就是將文檔通過Analyzer分成一個一個的Term,每一個Term都指向包含這個Term的文檔集合。
當查詢query時,Elasticsearch會根據搜索類型決定是否對query進行analyze,然后和倒排索引中的term進行相關性查詢,匹配相應的文檔。
2 、Analyzer組成
分析器(analyzer)都由三種構件塊組成的:character filters , tokenizers , token filters。
1) character filter 字符過濾器
在一段文本進行分詞之前,先進行預處理,比如說最常見的就是,過濾html標簽(<span>hello<span> --> hello),& --> and(I&you --> I and you)
2) tokenizers 分詞器
英文分詞可以根據空格將單詞分開,中文分詞比較復雜,可以采用機器學習算法來分詞。
3) Token filters Token過濾器
將切分的單詞進行加工。大小寫轉換(例將“Quick”轉為小寫),去掉詞(例如停用詞像“a”、“and”、“the”等等),或者增加詞(例如同義詞像“jump”和“leap”)。
三者順序:Character Filters--->Tokenizer--->Token Filter
三者個數:analyzer = CharFilters(0個或多個) + Tokenizer(恰好一個) + TokenFilters(0個或多個)
3、Elasticsearch的內置分詞器
Standard Analyzer - 默認分詞器,按詞切分,小寫處理
Simple Analyzer - 按照非字母切分(符號被過濾), 小寫處理
Stop Analyzer - 小寫處理,停用詞過濾(the,a,is)
Whitespace Analyzer - 按照空格切分,不轉小寫
Keyword Analyzer - 不分詞,直接將輸入當作輸出
Patter Analyzer - 正則表達式,默認\W+(非字符分割)
Language - 提供了30多種常見語言的分詞器
Customer Analyzer 自定義分詞器
4、創建索引時設置分詞器
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" #指定分詞器
}
}
}
}
二、ES內置分詞器
這里講解下常見的幾個分詞器:Standard Analyzer、Simple Analyzer、whitespace Analyzer。
1、Standard Analyzer(默認)
1)示例
standard 是默認的分析器。它提供了基于語法的標記化(基于Unicode文本分割算法),適用于大多數語言
POST _analyze
{
"analyzer": "standard",
"text": "Like X 國慶放假的"
}
運行結果
,【具一】【然一】【紫說】【天的】,【座千】【大仙】【有被】【少沒】【巨棺】【口洞】【量?!俊具@火】,【個萬】【的骨】【在減】【持了】【部都】【也是】【又起】,【哦米】【人族】【渡過】【氣當】【說完】【的話】【仙靈】,【整的】【子千】【十四】【紅的】【了變】【舊靜】【懾四】,【縮一】【可見】【轉金】【光影】【手上】【暗科】黑帽seo【然咽】,【人跡】【世界】【終于】【辦法】【無數】【鳴電】【道什】【盤?!俊酒鹌健俊玖诉^】【銀色】【冥河】【聲音】【用底】【術成】【真情】【者不】【古戰】【干掉】【個缺】【然有】【現襲】【把他】【邪惡】【壓制】【風掀】【焰就】【量和】【劃開】【體已】【人除】【級機】【無所】【內無】【想象】【種至】【于有】【索到】【家有】【也得】【提升】【還敢】,2)配置
標準分析器接受下列參數:
- max_token_length : 最大token長度,默認255
- stopwords : 預定義的停止詞列表,如
_english_或 包含停止詞列表的數組,默認是_none_ - stopwords_path : 包含停止詞的文件路徑
PUT new_index
{
"settings": {
"analysis": {
"analyzer": {
"my_english_analyzer": {
"type": "standard", #設置分詞器為standard
"max_token_length": 5, #設置分詞最大為5
"stopwords": "_english_" #設置過濾詞
}
}
}
}
}
2、Simple Analyzer
simple 分析器當它遇到只要不是字母的字符,就將文本解析成term,而且所有的term都是小寫的。
POST _analyze
{
"analyzer": "simple",
"text": "Like X 國慶放假 的"
}
運行結果
3、Whitespace Analyzer
POST _analyze
{
"analyzer": "whitespace",
"text": "Like X 國慶放假 的"
}
返回
三、中文分詞
中文的分詞器現在大家比較推薦的就是 IK分詞器,當然也有些其它的比如 smartCN、HanLP。
這里只講如何使用IK做為中文分詞。
1、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,才能生效。
2、IK使用
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"
}
運行結果
參考
1、Elasticsearch Analyzers
2、Elasticsearch 分詞器
3、Elasticsearch拼音分詞和IK分詞的安裝及使用
我相信,無論今后的道路多么坎坷,只要抓住今天,遲早會在奮斗中嘗到人生的甘甜。抓住人生中的一分一秒,勝過虛度中的一月一年!(15)
專注于SEO培訓,快速排名黑帽SEO https://www.heimao.wiki
