您的位置:首页 > 其它

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

2016-05-31 19:19 627 查看
       写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可以设置的属性:

设置说明
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 单词的列表.默认单词是空的列表
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:

SettingDescription
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: