这部分文档主要包含:
- 倒排索引
- Analyzer分词
倒排索引
举例类比
做个类比,看书时,我们看到了哪个章节,根据章节标题去目录中检索具体的内容。但是当我们回忆起一些只言片语,一些句子,一些情节时,去定位它出现的章节和页码,就便类似于倒排索引了。
在es中,正排索引就是文档id和文档内容的关联,而倒排索引就是文档内容和文档id的关联。
下面是三个文档
文档id | 内容 |
---|---|
1 | study elasticsearch |
2 | learn elasticsearch |
3 | elasticsearch method |
经过倒排索引后
Term(单词) | Count | DocumentID:Position |
---|---|---|
elasticsearch | 3 | 1:1,2:4,3:0 |
study | 1 | 1:0 |
learn | 1 | 2:0 |
method | 1 | 3:1 |
(Term,一段文本经过分析后会输出一串单词,一个一个的叫做Term)
以上就是一个简单的正排索引和倒排索引的例子
核心组成
- 倒排索引包含两个部分
一个例子-以单词 elasticsearch
为例
文档id | 内容 |
---|---|
1 | study elasticsearch |
2 | learn elasticsearch |
3 | elasticsearch method |
elasticsearch的Posting List
如下
Doc Id | TF | Position | Offset |
---|---|---|---|
1 | 1 | 1 | <6,19> |
2 | 1 | 1 | <6,19> |
3 | 1 | 0 | <0,13> |
elasticsearch的倒排索引特点
- Elasticsearch的json文档中的每个字段,都有自己的倒排索引
- 可以指定对某些字段不做索引
- 优点:节省存储空间
- 缺点:字段无法被搜索
Analyzer分词
Analysis和Analyzer
Analysis
(文本分析) - 是把全文的转换为一系列单词(term/token)的过程,也叫分词Analysis
是通过Analyzer
来实现的- 可使用elasticsearch内置的分析器或者按需定制分析器
- 除了在数据写入时转换词条,匹配Query语句时候也需要用相同的分析器对查询语句进行分析
input:
Elasticsearch Server
output:
elasticsearch
server
# 仔细看会发现,经过分词器处理后,Elasticsearch被转换成了elasticsearch,大写字母自动转换成了小写
Analyzer的组成
- 分词器是专门处理分词的组件,Analyzer由三部分组成
- Character Filters(针对原始文本处理,例如去除html)
- Tokenizer(按照规则切分为单词)
- Token Filter(将切分的单词进行加工,小写,删除stopwords,增加同义词)

使用_analyzer API
直接指定Analyzer进行测试
GET /_analyze
{
"analyzer": "standard",
"text":"Mastering Elasticsearch,elasticsearch in Action"
}
指定索引的字段进行测试
POST my_index/_analyze
{
"field": "title",
"text": "Mastering Elasticsearch"
}
自定义分词器进行测试
POST /_analyze
{
"tokenizer": "standard",
"filter": ["lowercase"],
"text": "Mastering Elastricsearch"
}
elasticsearch的内置分词器
名称 | 作用 |
---|---|
Standard Analyzer | 默认分词器,按词切分,小写处理 |
Simple Analyzer | 按照非字母切分(符号被过滤),小写处理 |
Stop Analyzer | 小写处理,停用词过滤(a/the/is) |
Whitespace Analyzer | 按照空格切分,不转小写 |
Keyword Analyzer | 部分词,直接将输入当做输出 |
Patter Analyzer | 正则表达式,默认\W+(非字符分割) |
Language | 提供了30多种常见语言的分词器 |
Customer Analyzer | 自定义分词器 |
standard analyzer

- 是es默认分词器
- 按词切分
- 小写处理
simple analyzer

- 按照非字母切分,非字母的都被去除
- 小写处理
whitespace Analyzer

- 按空格切分
stop analyzer

- 相比simple analyzer多了stop filter
- 会把the,a,is等修饰性词语去除
Keyword Analyzer

- 不分词,直接将输入当一个term输出
Pattern Analyzer

- 使用正则表达式进行分词(不懂正则的小伙伴可查看正则表达式30分钟入门教程)
- 默认是
\W+
,非字符的符号进行分隔
Language Analyzer
一组分析特定语言文本的分析器,支持以下类型:
arabic
,armenian
,basque
,bengali
,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
.
中文分词的难点
- 中文句子,切分成一个个词(不是一个个字)
- 英文中,单词由自然的空格作为分隔
- 一句中文,在不同的上下文,有不同的含义
- 例子
- 这事的确确定不下来
ICU Analyzer

- 需要安装plugin
- ELasticsearch-plugin install analysis-icu(参考我之前的安装文档:Elasticsearch 的安装与简单配置)
- 提供了Unicode的支持,更好的支持亚洲语言
GET _analyze
{
"analyzer": "icu_analyzer",
"text": "这事的确确定不下来"
}
分词结果
{
"tokens" : [
{
"token" : "这",
"start_offset" : 0,
"end_offset" : 1,
"type" : "<IDEOGRAPHIC>",
"position" : 0
},
{
"token" : "事",
"start_offset" : 1,
"end_offset" : 2,
"type" : "<IDEOGRAPHIC>",
"position" : 1
},
{
"token" : "的确",
"start_offset" : 2,
"end_offset" : 4,
"type" : "<IDEOGRAPHIC>",
"position" : 2
},
{
"token" : "确定",
"start_offset" : 4,
"end_offset" : 6,
"type" : "<IDEOGRAPHIC>",
"position" : 3
},
{
"token" : "不下来",
"start_offset" : 6,
"end_offset" : 9,
"type" : "<IDEOGRAPHIC>",
"position" : 4
}
]
}
小结
本篇中接触了es的倒排索引结构和各种analyzer分词器,并基本介绍了各分词器的基本使用,较为简单。
参考文档
觉得不错,请点个赞吧
