首先要明確一點,ElasticSearch是基於Lucene的,它的不少基礎性組件,都是由Apache Lucene提供的,而es則提供了更高層次的封裝以及分佈式方面的加強與擴展。
因此要想熟練的掌握的關於es中分詞方面的知識,必定得先從Lucene抓起,不然只會是丈二和尚摸不着頭腦,固然咱們大多數開發者只關注於怎麼用,偏底層的東東,也沒有太多時間去深究,這也有情可原,遇到問題再去探究,也未嘗不是一種辦法,若是有時間,仍是建議看看Lucene基礎的知識。
在ElasticSearch或Solr中,都提供了基於配置的可插拔式的分詞插件,管理方式,這樣以來就組合配置方式就很是靈活,在es中,一個analysis集合
能夠包含多個analyzer,而一個analyzer則由一個單個的tokenizer,零個或多個的tokenfilter組成,而一個tokenizer又能夠包含零個或多個的charFilter。整體的執行流程以下圖:
在es裏面的一個模板配置以下:
html
index : elasticsearch
analysis ://一個analysis能夠包含多個analyzer,tokenizer,filter,char_filter配置 分佈式
analyzer :// 一個analyzer下面能夠包含一個tokenizer,多個filter和char_filter, position_increment_gap是距離查詢時,最大容許查詢的距離,默認是100 ide
myAnalyzer1 : ui
type : custom spa
tokenizer : myTokenizer1 插件
filter : [myTokenFilter1, myTokenFilter2] orm
char_filter : [my_html] htm
position_increment_gap: 256
myAnalyzer2 :
type : custom
tokenizer : myTokenizer1
filter : [myTokenFilter1, myTokenFilter2]
char_filter : [my_html]
position_increment_gap: 256
tokenizer :
myTokenizer1 :
type : standard
max_token_length : 900
myTokenizer2 :
type : keyword
max_token_length : 900
filter :
myTokenFilter1 :
type : stop
stopwords : [stop1, stop2, stop3, stop4]
myTokenFilter2 :
type : length
min : 0
max : 2000
char_filter :
my_html :
type : html_strip
escaped_tags : [xxx, yyy]
read_ahead : 1024
一個比較完整的分詞器配置案例,就如上面的例子,幾乎涵蓋了全部可能用到的組件,而咱們在實際應用中,要作的就是,選擇組合咱們須要的組件,定製成一個分詞器,而後就可使用了,
上面的這段配置,咱們須要配置在elasticsearch.yml文件中,全局有效,而後咱們就能夠在靜態mapping或動態mapping中引用和使用它了。
參考連接:
https://www.elastic.co/guide/en/elasticsearch/reference/2.1/analysis-custom-analyzer.html