elasticsearch-倒排索引
学习思路
- 名词概念解释
- 举个小栗子
一、名词解释
- 正向索引:我们熟悉的数据库索引,通过索引值(key)找到对应的数据(value)
- 反向索引(倒排索引):value一般是一个文档(字符相对较长),通过分词得到多个词语,然后给每个词语建立正向索引都指向value;通过分词后的任意一个词都能查到value(实际中一般不是直接对应value,而是对应value的唯一标识,然后通过唯一标识查value);简单说就是通过value的分词查询key
- 文档(document):一般指一个html、json、xml、文件等;我们存在elasticsearch里的一般是一段json串
- 文档编号:文档的唯一标识
- 文档集合:就是所有的文档,就是我们存在elasticsearch里的所有数据(document)
- 倒排列表:出现某个词语的所有文档的集合;比如“美丽”这个词在1、2(1、2代表文档编码)文档里都存在,那么“美丽”对应的倒排列表就是[1,2]
简单说:正向是通过key查询value;反向是通过value分词查询key
我们存储的文档一般都是海量的,如果用正向索引(逐条查询)那耗时不可估量,如果使用倒排索引(按照输入的词查询这个词所查询出倒排列表,然后经过一系列的权重排序等展示给用户即可,当用户点击是通过文档编码查询对应文档即可)
二、举个小栗子
我们有5个文档
左边为文档编号,右边为文档内容,我们现在要做的就是将5个文档建立倒排索引
- 将每个文档进行中文分词
- 将每个分词对应倒排列表
当我们搜索“加盟”时就直接能找到对应的倒排列表[2,3,5],然后直接将2、3、5文档返回即可(如果返回文档很多可能有各种算法排序选择),用户点击3时直接查询3对应的文档即可、
当然实际中倒排列表并非这么简单,除了文档编号外还包含一些:词语出现的频率(TF)、文档的频率、词语出现的位置等信息,往往用于计算因此存在
如下图就是包含文档编码和词语出现频率(文档编码,出现频率)
比如“加盟”在2、3、5文档分别出现一次
实际查询“加盟”过程:
- 用户输入“加盟”,点击搜索
- 根据“加盟”查询倒排列表
- 根据倒排列表里的各项计算因子进行排序、选择等以最适合用户的方式展示出来
- 点击相应的文档,按照文档编号查询对应文档即可
公众号主要记录各种源码、面试题、微服务技术栈,帮忙关注一波,非常感谢