ES倒排索引基本原理

索引(index)可以分为正序索引(Forward Indexes)和倒排索引(Inverted Index)两种。在关系型数据库中使用索引可以避免数据检索走全表扫描,将检索的时间复杂度从O(n)降到了O(logn)。例如,一本字典在开篇几页记录了每个字和所在页码的映射关系,当我们需要查阅某个字的时候不需要从每一页开始搜索,通过这个映射关系就能快速找到需要搜索的词项。假设现在有三个文档:doc1, doc2, doc3

doc1: Welcome to Hotel California

doc2: Welcome to the heaven

doc3: the dog is very cute

在关系型数据库中存储这三个文档并且建立索引,文档在数据库中的存储结构大概如下所示

Doc ID Doc Content
1 Welcome to Hotel California
2 Welcome to the heaven
3 the dog is very cute

通过建立这种文档id与文档内容的映射关系,在关系型数据库中可以快速查找到文档的具体位置,但是如果需要对文档中某些词项进行检索,则需要进行全表扫描,这个时候正序索引就失效了。

倒排索引的思想是建立文档中每个词项与文档的的映射关系,如下所示

Term Doc Id
welcome Doc1, Doc2
to Doc1,Doc2
the Doc2,Doc3
dog Doc3
heaven Doc2
.... ...

可以看出通过倒排索引,搜索任意一个词项都能快速定位到所在位置。通过上述例子可以看出顺序索引是文档ID与文档内容和单词的关联,倒排索引是单词到文档ID的映射关系。

倒排索引核心组成

倒排索引主要包括两部分:单词词典和倒排列表。

  • 单词词典:记录所有文档的单词,记录单词和倒排列表的关联关系
  • 倒排列表:记录单词与对应文档集合,由倒排索引项组成
    • 倒排索引项:主要由文档ID,词频TF(单词在文档中出现的次数,用于相关性评分),位置(Position,单词在文档中分词的位置,用于语句搜索) ,偏移(Offset,记录单词的开始结束位置,用于实现高亮显示)

Elaticsearch的JSON文档中每个字段都有自己的倒排索引,可以对文档中不需要搜索的字段不做索引,这样可以节省存储空间

最新文章

  1. Guava 是个风火轮之函数式编程(3)——表处理
  2. oracle数据库误操作把表删除了,怎样恢复
  3. C#中combobox 控件属性、事件、方法
  4. poj3694(tarjan缩点+lca)
  5. VMware NAT方式 CentOS 6.8配置静态IP
  6. 【实战分享】又拍云 OpenResty / Nginx 服务优化实践
  7. 骨灰级玩家体验带你测试体验天使纪元OL折扣端
  8. vue 使用技巧总结 18.11
  9. eclipse添加market ,maven
  10. 【ARTS】01_18_左耳听风-20190311~20190317
  11. PAT-Top1002. Business (35)
  12. Archlinux/Manjaro使用笔记-安装配置搜狗输入法步骤
  13. sublime text3最常用快捷键
  14. python 操作系统模块 -- OS
  15. 获取泛型的class 反射
  16. UITableView横向滚动
  17. C输入输出与文件
  18. 三、git管理修改
  19. BZOJ3473:字符串(后缀数组,主席树,二分,ST表)
  20. asp.net将ppt文档转换成pdf

热门文章

  1. make CLI Comfortable When Working in Multiple Directoies
  2. Fluid + GooseFS 助力云原生数据编排与加速快速落地
  3. 使用sklearn中的fetch_mldata的错误情况以及可能可行的解决方法
  4. Linux搭建Ldap服务器
  5. NOIP 模拟 $16\; \rm Lost My Music$
  6. 旅游景点 Tourist Attractions 题解
  7. NameNode&Secondary NameNode 工作机制
  8. 关于Ubuntu18.04 linux系统下使用Tim QQ 微信
  9. 基于 Mysql 实现一个简易版搜索引擎
  10. Golang slice作为函数参数