Elasticsearch的倒排索引和分词器
一、倒排索引
1、概念
倒排索引:是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。它是文档检索系统中最常用的数据结构。通过倒排索引,可以根据单词快速获取包含这个单词的文档列表。
2.倒排索引的构成
倒排索引包括两部分:单词词典(Term Dictionary)和倒排列表(Posting List).
1.单词词典(Term Dictionary)
记录了所有文档的单词,记录单词与倒排列表的关联关系。
单词词典一般比较大,可以通过B+树或者哈希拉链法实现,以满足高性能的插入与查询
2.倒排列表(Posting List)
倒排列表记录了单词对应的文档结合,由倒排索引项组成:
倒排索引项(Posting)
- 文档ID
- 词频TF—该单词在文档中出现的次数,用于相关性评分
- 位置(Positon)—单词在文档中分词的位置,用于语句搜索(phrase query)
- 偏移(Offset)—记录单词的开始结束位置,实现高亮显示。
3.Elasticsearch的倒排索引
- Elasticsearch的JSON文档中的每个字段,都有自己的倒排索引
- 可以指定对某些字段不做索引
- 优点:节省存储空间
- 缺点:字段无法被搜索
二、Elasticsearch的分词器
1.基本概念
- 分词(Analysis):也称为文本分析,就是把全部的文本替换一系列单词(token)的过程,它是使用分词器(Analyzer)来实现的。
- 分词器(Analyzer):是专门处理分词的组件,由3部分组成:
- Character Filters:针对文本进行处理,比如去除html等;
- Tokenizer:按照规则切分为单词;
- Token Filter:将切分的单词进行加工,小写,删除停用词,增加同义词等。
2.Elasticsearch的常见内置分词器介绍
1.Standard Analyzer标准默认分词器
Standard Analyzer按词切分(其中的符号被过滤),filter做小写处理,不使用停用词;
2.Simple Analyzer
Simple Analyzer,按非字母切分(其中的非字母的被过滤),filter做小写处理,不使用停用词。
3.Stop Analyzer
Stop Analyzer,是Simple Analyzer 的升级版,按非字母切分(其中的非字母的被过滤),filter做小写处理,使用停用词(会把the,a is等修饰词去除)。
4.Whitespace Analyzer
Whitespace Analyzer,按照空格切分(不过滤符号),区分大小写,不使用停用词
5.Keyword Analyzer
Keyword Analyzer,不做分词,直接将输入当成一个语句输出
6.Pattern Analyzer
Pattern Analyzer,通过正则表达式进行分词(其中的符号被过滤),默认\W+, 非字符的符号进行分隔,,不使用停用词。
7.Language Analyzer
Language Analyzer,根据语言进行分词。
3.Elasticsearch的中文分词器介绍
1.中文分词的难点
- 中文句子,切分成一个一个词(而不是一个一个字)
- 英文中,单词有自然的空格作为分隔
- 一个句子,在不同的上下文,有不同的理解
2.三种中文分词简介
1.icu_analyzer
icu_analyzer,增加对Unicode和全球化的支持,以提供对亚洲语言更好的文本分割分析,还有大量对除英语外其他语言进行正确匹配和排序所必须的分词过滤器。
插件地址:https://www.elastic.co/guide/en/elasticsearch/plugins/current/analysis-icu.html
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" : 7,
"type" : "<IDEOGRAPHIC>",
"position" : 3
}
]
}
2.elasticsearch-analysis-ik
非常牛逼的一款开源的中文分词器,推荐使用。
git地址:https://github.com/medcl/elasticsearch-analysis-ik
详细的资料,请自行查看吧,这里给一个列子:
GET _analyze
{
"analyzer": "ik_smart",
"text":"我爱北京天安门"
}
分词结果:
{
"tokens" : [
{
"token" : "我",
"start_offset" : 0,
"end_offset" : 1,
"type" : "CN_CHAR",
"position" : 0
},
{
"token" : "爱",
"start_offset" : 1,
"end_offset" : 2,
"type" : "CN_CHAR",
"position" : 1
},
{
"token" : "北京",
"start_offset" : 2,
"end_offset" : 4,
"type" : "CN_WORD",
"position" : 2
},
{
"token" : "天安门",
"start_offset" : 4,
"end_offset" : 7,
"type" : "CN_WORD",
"position" : 3
}
]
}
3.thulac分词器
THU Lexucal Analyzer for Chinese,, 清华大学自然语言处理和社会人文计算实验室的一套中文分词器。
git地址:https://github.com/microbun/elasticsearch-thulac-plugin
但是这个分词器目前还没有针对elasticsearch7.11.1的分词器的release的包。