这部分文档主要包含:
- 倒排索引
- 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分词器,并基本介绍了各分词器的基本使用,较为简单。
参考文档
觉得不错,请点个赞吧