写ElasticSearch的搜索Schema是一件让人头疼的事儿,看着满屏的“特殊字符”(例如:“keyword”、“nGram”等等)有种想吐的感觉:为何这么定义?定义了是什么意思?有什么效果?
为此,我总结了一些用法,希望会有所帮助。
首先,要知道一个单词或者短语,进入到ElasticSearch是如何被处理的:
文字太过枯燥,我直接上从网上扒来的图:
单词或文档先经过Character Filters;Character Filters的作用就是对文本进行一个预处理,例如把文本中所有“&”换成“and”,把“?”去掉等等操作。
之后就进入了十分重要的tokenizers模块了,Tokenizers的作用是进行分词,例如,“tom is a good doctor .”。经过Character Filters去掉句号“.”(假设)后,分词器Tokenizers会将这个文本分出很多词来:“tom”、“is”、“a”、“good”、“doctor”。
经过分词之后的集合,最后会进入Token Filter词单元模块进行处理,此模块的作用是对已经分词后的集合(tokens)单元再进行操作,例如把“tom”再次拆分成“t”、“o”、“m”等操作。最后得出来的结果集合,就是最终的集合。
所以整个流程是:单词 ====》Character Filter 预处理 =====》tokenizer分词 ====》 token filter对分词进行再处理。
到此为止,Analyzer是什么鬼?它干什么呢?
Analyzer是由一个tokenizer、零到多个Token Filter、还有零到多个CharFilters构成的,也就是说一个Analyzer就是一个完整的解析模块。
下面,着重介绍一下常用的Analyzer、Tokenizer、Token filter、Character Filter:
Standard Analyzer
一个“standard”标准类型的 analyzer 就是由 标准分词 “Standard Tokenizer”和标准分词过滤器“Standard Token Filter”、小写字母转换分词过滤“Lower case Token Filter”、还有“Stop Token Filter”过滤构成的
以下是一个standard类型
stopwords 一个用于初始化stop filter的需要stop 单词的列表.默认为空 。 |
|
---|---|
|
max_token_length 最大的token集合,即经过tokenizer过后得到的结果集的最大值。如果token的长度超过了设置的长度,将会继续分,默认255 |
|
Stop Analyzer |
一个stop类型的analyzer是由 Lower case Tokenizer 和 Stop Token Filter构成的。
以下是一个stop analyzer可以设置的属性:
设置 | 说明 |
---|---|
|
一个用于初始化stop filter的需要stop 单词的列表.默认单词是英语 |
|
一个有stopwords 配置文件的路径(一个和config文件相关的路径或者URL) |
用“stopwords: _none_
”来定义一个空的stopword列表
Simple Analyzer
一个simple类型的analyzer是由lower case Tokenizer构成的,具体信息可以查看此Tokenzier
Whitespace Analyzer
一个whitespace类型的analyzer是由Whitespace Tokenizer构成,请具体查看Whitespace Tokenizer
Keyword Analyzer
一个keyword类型的analyzer,它的Tokenizer将整块的数据作为一个小Token(即经过Tokenizer过滤后的数据),这对于像“邮政编码”、“id”等数据非常有用。注意:当使用并定义这种analyzer的时候,单纯的将fieled 设置为“not_analyzed”可能会更有意义。
Pattern Analyzer
一个pattern类型的analyzer可以通过正则表达式将文本分成"terms"(经过token Filter 后得到的东西 )。接受如下设置:
一个 pattern
analyzer 可以做如下的属性设置:
|
terms是否是小写. 默认为 |
|
正则表达式的pattern, 默认是 |
|
正则表达式的flags. |
|
一个用于初始化stop filter的需要stop 单词的列表.默认单词是空的列表 |
Snowball Analyzer
一个snowball类型的analyzer是由standard tokenizer和standard filter、lowercase filter、stop filter、snowball filter这四个filter构成的。
snowball analyzer 在Lucene中通常是不推荐使用的。
Language Analyzers
一个用于解析特殊语言文本的analyzer集合。( arabic
,armenian
, basque
, brazilian
, bulgarian
, catalan
, cjk
, czech
, danish
, dutch
, english
, finnish
, french
,galician
, german
, greek
, hindi
, hungarian
, indonesian
, irish
, italian
, latvian
, lithuanian
, norwegian
,persian
, portuguese
, romanian
, russian
, sorani
, spanish
, swedish
, turkish
, thai
.)可惜没有中文。不予考虑
Custom Analyzer
简而言之,是自定义的analyzer。允许多个零到多个tokenizer,零到多个 Char Filters
. custom analyzer 的名字不能以 "_"开头.
The following are settings that can be set for a custom
analyzer type:
Setting | Description |
---|---|
|
通用的或者注册的tokenizer. |
|
通用的或者注册的 token filters. |
|
通用的或者注册的 character filters. |
|
距离查询时,最大允许查询的距离,默认是100 |
index :
analysis :
analyzer :
myAnalyzer2 :
type : custom
tokenizer : myTokenizer1
filter : [myTokenFilter1, myTokenFilter2]
char_filter : [my_html]
position_increment_gap: 256
tokenizer :
myTokenizer1 :
type : standard
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