分词器的作用是当一个文档被索引的时候,分词器从文档中提取出若干词元(Token)来支持索引的存储和搜索。
分词器是由一个分解器(Tokenizer)和零个或多个词元过滤器(token filters)组成。分解器处理前可能要做一些预处理, 比如去掉里面的HTML标记, 这些处理的算法被称为字符过滤器(Character Filter),一个分解器会有一个或多个字符过滤器。分解器是用来分解字符串成一系列术语或词元(Token)。一个简单的分解器是把一个句子当遇到空格或标点符号是进行分解成一个个的索引词。Elasticsearch内置了分解器,同时也支持自定义分解器。
词元过滤器的作用是对分词器提取出来的Token(词元)被进一步处理, 比如转成小写,增加同义词等。被处理后的结果被称为Term(索引词), 文档中包含了几个这样的Term被称为Frequency(词频)。 引擎会建立Term和原文档的Inverted Index(倒排索引), 这样就能根据Term很快到找到源文档了。
ES内置了很多Analyzer, 还有很多第三方的Analyzer插件, 比如一些处理中文的Analyzer(中文分词)。
索引分析模块由一个分词器(Analyzer),分解器(Tokenizer)和词元过滤器(token filters)组成。如果没有明确的定义分析模块,系统会用内置的分词器,分解器,和过滤器。下面是一个分析器的配置:
index :
analysis :
analyzer :
standard :
type : standard
stopwords : [stop1, stop2]
myAnalyzer1 :
type : standard
stopwords : [stop1, stop2, stop3]
max_token_length : 500
# configure a custom analyzer which is
# exactly like the default standard analyzer
myAnalyzer2 :
tokenizer : standard
filter : [standard, lowercase, stop]
tokenizer :
myTokenizer1 :
type : standard
max_token_length : 900
myTokenizer2 :
type : keyword
buffer_size : 512
filter :
myTokenFilter1 :
type : stop
stopwords : [stop1, stop2, stop3, stop4]
myTokenFilter2 :
type : length
min : 0
max : 2000
当没有明确的定义分词器模块,系统会用内置的分词器,系统有一个配置选项来定义哪个分词器将在默认情况下使用。默认的逻辑名称下有一个的分词器,将用于索引和搜索。配置参数为default_search。例如:
index :
analysis :
analyzer :
default :
tokenizer : keyword
index :
analysis :
analyzer :
standard :
alias: [alias1, alias2]
type : standard
stopwords : [test1, test2, test3]
Standard Analyzer,Simple Analyzer,Whitespace Analyzer,Stop Analyzer,Keyword Analyzer,Pattern Analyzer,Language Analyzers,Snowball Analyzer,Custom Analyzer。
系统默认的分解器有:Standard Tokenizer,Edge NGram Tokenizer,Keyword Tokenizer,Letter Tokenizer,Lowercase Tokenizer,NGram Tokenizer,Whitespace Tokenizer,Pattern Tokenizer,UAX Email URL Tokenizer,Path Hierarchy Tokenizer,Classic Tokenizer,Thai Tokenizer。
系统默认的词元过滤器有:Standard Token Filter,ASCII Folding Token Filter,Length Token Filter,Lowercase Token Filter,Uppercase Token Filter,NGram Token Filter,Edge NGram Token Filter,Porter Stem Token Filter,Shingle Token Filter,Stop Token Filter,Word Delimiter Token Filter,Stemmer Token Filter,Stemmer Override Token Filter,Keyword Marker Token Filter,Keyword Repeat Token Filter,KStem Token Filter,Snowball Token Filter,Phonetic Token Filter,Synonym Token Filter,Compound Word Token Filter,Reverse Token Filter,Elision Token Filter,Truncate Token Filter,Unique Token Filter,Pattern Capture Token Filter,Pattern Replace Token Filter,Trim Token Filter,Limit Token Count Token Filter,Hunspell Token Filter,Common Grams Token Filter,Normalization Token Filter,CJK Width Token Filter,CJK Bigram Token Filter,Delimited Payload Token Filter,Keep Words Token Filter,Keep Types Token Filter,Classic Token Filter,Apostrophe Token Filter,Decimal Digit Token Filter。
Mapping Char Filter,HTML Strip Char Filter,Pattern Replace Char Filter。
分析模块的使用可以通过索引分析来进行体现。比如:
请求:POST http://127.0.0.1:9200/_analyze/
参数:
{
"tokenizer": "standard",
"filters": [
"lowercase",
"stop"
],
"text": "SecIsland is a data company."
}
注意"analyzer","tokenizer","filters"三个是关键字。analyzer在内容上包括tokenizer和filters,所以可以只输入analyzer,或者输tokenizer和filters。
得到的结果是:
{
"tokens": [
{
"token": "secisland",
"start_offset": 0,
"end_offset": 9,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "data",
"start_offset": 15,
"end_offset": 19,
"type": "<ALPHANUM>",
"position": 3
},
{
"token": "company",
"start_offset": 20,
"end_offset": 27,
"type": "<ALPHANUM>",
"position": 4
}
]
}
赛克蓝德(secisland)后续会逐步对Elasticsearch的最新版本的各项功能进行分析,近请期待。