ElasticSearch中的analysis、analyzer、tokenizer、filter都是什么意思?
Elasticsearch把每条数据叫做Document
,然后提交到Index
中。
简单说,Document
中的数据是如何转变成倒排索引的,以及查询语句是如何转换成一个个词(Term
)使高效率文本搜索变得可行,这种转换数据的过程就称为文本分析(analysis
)。
analysis
基本概念 === elasticsearch全文搜索引擎会用某种算法(Tokenizer
)对要建索引的文档进行分析, 从文档中提取出若干Token
(词元), 这些算法称为Tokenizer
(分词器), 这些Token
会被进一步处理, 比如转成小写等, 这些进一步的处理算法被称为Filter
(过滤器), 被处理后的结果被称为Term
(词), 文档中包含了几个这样的Term
被称为Frequency
(词频)。 引擎会建立Term
和原文档的Inverted Index(倒排索引), 这样就能根据Term
很快到找到源文档了。
文本分析(analysis
)工作由analyzer
(分析器)组件负责。analyzer
由一个分词器(tokenizer
)和0个或者多个过滤器(filter
)组成,也可能会有0个或者多个字符映射器(character mappers
)组成。
tokenizer
用来把文本拆分成一个个的Token
。Token
包含了比较多的信息,比如Term
在文本的中的位置及Term
原始文本,以及Term
的长度。文本经过tokenizer
处理后的结果称为token stream
。token stream
其实就是一个个Token
的顺序排列。token stream
将等待着filter
来处理。
filter
链将用来处理Token Stream
中的每一个token
。这些处理方式包括删除Token
,改变Token
,甚至添加新的Token。比如变小写,去掉里面的HTML标记, 这些处理的算法被称为Character Filter
(字符过滤器),Elasticsearch中内置了许多filter,读者也可以轻松地自己实现一个filter
。
我们来看我们的例子:
{
"settings": {
"analysis": {
"filter": {
"autocomplete_filter": {
"type": "edge_ngram",
"min_gram": 1,
"max_gram": 20
}
},
"analyzer": {
"autocomplete": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"autocomplete_filter"
]
}
}
}
}
}
首先是定义analysis
(文本分析),其中我们先定义了一个文本处理的filter
–>autocompletefilter
,然后定义analyzer
(分析器),分析器由tokenizer
(分词器)和两个过滤器组成,tokenizer
用标准的,filter
中一个是内置的lowercase
,一个是我们上面定义的autocompletefilter
,这下就清楚了吧。