Elasticsearch(10) — 內置分詞器、中文分詞器

  • 2019 年 10 月 3 日
  • 筆記

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 filterstokenizerstoken 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 AnalyzerSimple Analyzerwhitespace Analyzer

1、Standard Analyzer(默認)

1)示例

standard 是默認的分析器。它提供了基於語法的標記化(基於Unicode文本分割演算法),適用於大多數語言

POST _analyze  {    "analyzer": "standard",    "text":     "Like X 國慶放假的"  }

運行結果

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分詞器,當然也有些其它的比如 smartCNHanLP

這裡只講如何使用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)