ElasticSearch 解析机制常见用法库 之 analyzer常用用法

释放双眼,带上耳机,听听看~!

       写ElasticSearch的搜索Schema是一件让人头疼的事儿,看着满屏的“特殊字符”(例如:“keyword”、“nGram”等等)有种想吐的感觉:为何这么定义?定义了是什么意思?有什么效果?

       为此,我总结了一些用法,希望会有所帮助。

       首先,要知道一个单词或者短语,进入到ElasticSearch是如何被处理的:

       文字太过枯燥,我直接上从网上扒来的图:

       ElasticSearch 解析机制常见用法库 之 analyzer常用用法

          单词或文档先经过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类型

 max_token_length             最大的token集合,即经过tokenizer过后得到的结果集的最大值。如果token的长度超过了设置的长度,将会继续分,默认255

Stop Analyzer

一个stop类型的analyzer是由 Lower case Tokenizer 和 Stop Token Filter构成的。

以下是一个stop analyzer可以设置的属性:

stopwords
一个用于初始化stop filter的需要stop 单词的列表.默认单词是英语 
stopwords_path
一个有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 可以做如下的属性设置:

lowercase terms是否是小写. 默认为 true 小写.
pattern 正则表达式的pattern, 默认是 \W+.
flags 正则表达式的flags.
stopwords 一个用于初始化stop filter的需要stop 单词的列表.默认单词是空的列表

1
1

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:

tokenizer
通用的或者注册的tokenizer.
filter
通用的或者注册的 token filters.
char_filter
 通用的或者注册的 character filters.
position_increment_gap
距离查询时,最大允许查询的距离,默认是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

给TA打赏
共{{data.count}}人
人已打赏
安全运维

OpenSSH-8.7p1离线升级修复安全漏洞

2021-10-23 10:13:25

安全运维

设计模式的设计原则

2021-12-12 17:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索