正/倒排索引
类似于书的目录,目录能够方便的定位哪一章节或哪一小节的页码,但是无法定位某一关键字的位置。有一些书的最后有索引页,它的功能就是帮助定位某些关键字出现的位置。
目录页对应正排索引
索引页对应倒排索引
正排索引和倒排索引
对于搜索引擎来讲:
正排索引是文档 Id 到文档内容、单词的关联关系。也就是说可以通过 Id获取到文档的内容。
倒排索引是单词到文档 Id 的关联关系。也就是说了一通过单词搜索到文档 Id。
倒排索引的查询流程是:首先根据关键字搜索到对应的文档 Id,然后根据正排索引查询文档 Id 的完整内容,最后返回给用户想要的结果。
倒排索引的组成
倒排索引是搜索引擎的核心,主要包含两个部分:
- 单词词典(Trem Dictionary):记录的是所有的文档分词后的结果
- 倒排列表(Posting List):记录了单词对应文档的集合,由倒排索引项(Posting)组成。
单词字典的实现一般采用B+Tree的方式,来保证高效
倒排索引项(Posting)主要包含如下的信息:
1、文档ID,用于获取原始文档的信息
2、单词频率(TF,Term Frequency),记录该单词在该文档中出现的次数,用于后续相关性算分。
3、位置(Position),记录单词在文档中的分词位置(多个),用于做词语搜索。
4、偏移(Offset),记录单词在文档的开始和结束位置,用于高亮显示。
es存储的是一个json的内容,其中包含很多字段,每个字段都会有自己的倒排索引。
分词
分词和分词器
分词是指将文本转换成一系列的单词的过程,也可以叫做文本分析,在es中称为Analysis。
例如文本“elasticsearch是最流行的搜索引擎”,经过分词后变成“elasticsearch”,“流行”,“搜索引擎”
分词器(Analyzer)是es中专门用于分词的组件,它的组成如下:
组成 | 功能 |
---|---|
Character Filter | 针对原始文本进行处理,比如去除html标记符。 |
Tokenuzer | 将原始文本按照一定规则切分为单词。 |
Token Filters | 针对tokenizer处理的单词进行再加工,比如转为小写、删除或新增等。 |
分词器组成的调用是有顺序的:
Analyze API
es提供了一个测试分词的api接口,方便验证分词效果,endpoint是_analyze
这个api具有以下特点:
- 可以直接指定analyzer进行测试
- 可以直接指定索引中的字段进行测试
- 可以自定义分词器进行测试
直接指定analyzer进行测试
请求举例:
POST _analyze
{
"analyzer": "standard",
"text": "hello world"
}
analyzer表示指定的分词器,这里使用es自带的分词器standard,text用来指定待分词的文本
从结果中可以看到,分词器将文本分成了hello 和 world两个单词
指定索引中的字段进行测试
应用场景:当创建好索引后发现某一字段的查询和预期不一样,就可