ID | 作者 | 文章标题 | 文章内容 |
---|---|---|---|
1 | Cape1 | es索引 | 努力学习倒排索引 |
2 | Cape2 | mysql索引 | 学习普通索引 |
以上述内容为例,构建id正向索引和文章标题正向索引
索引 | 文章内容 |
---|---|
1 | 努力学习倒排索引 |
2 | 学习普通索引 |
es索引 | 努力学习倒排索引 |
mysql索引 | 学习普通索引 |
当我们知道文章id或者文章题目的时候,可以很容易的检索到文章的内容。但是,如果我们只知道文章中的某个关键词,例如需要检索到与“倒排索引”有关的文章时,就只能对文章内容进行全文检索了。当文章内容很大,数据量很多的时候就没有办法保证效率了。对于这类需求,关系型数据库的索引就不太合适了,最好使用基于倒排索引的数据库。
同样以上述内容为例构建倒排索引
Token | ID为1 的文章 | ID为2的文章 |
---|---|---|
努力 | √ | |
学习 | √ | √ |
倒排 | √ | |
普通 | √ | |
索引 | √ | √ |
上表倒排序索引包含两个部分:
单词词典:记录所有文档单词,记录单词到倒排列表的关联关系
倒排列表:记录单词与对应文档结合,由倒排索引项组成
每个Token为一个倒排索引项,包含以下4个内容
文档:Doc Id - 包含此Token的文档id
词频:TF - 单词在文档中出现的次数,用于相关性评分
位置:Position - 单词在文档中分词的位置,用于phrase query
偏移:Offset - 记录单词开始结束的位置,实现高亮显示
例如
单词 | Doc Id | TF | Position | Offset |
---|---|---|---|---|
学习 | 1 | 1 | 1 | <2,4> |
2 | 1 | 0 | <0,2> |
Analysis:即文本分析,是把全文本转化为一系列单词(term/token)的过程,也叫分词;在Elasticsearch中可通过分词器(Analyzer)实现分词,分词器可以是内置的也可以是定制分词器。
Analyzer 分词过程简介
1)字符过滤器 character filter
首先,字符串按顺序通过每个字符过滤器 。他们的任务是在分词前整理字符串。一个字符过滤器可以用来去掉HTML,或者将 & 转化成 and。
2)分词器 tokenizer
其次,字符串被 分词器 分为单个的词条。一个 whitespace的分词器遇到空格和标点的时候,可能会将文本拆分成词条。
3)令牌过滤器token filter
最后,词条按顺序通过每个 token 过滤器 。这个过程可能会改变词条,例如,lowercase token filter 小写化(将ES转为es)、stop token filter 删除词条(例如, 像 a, and, the 等无用词),或者synonym token filter 增加词条(例如,像 jump 和 leap 这种同义词)。