倒排索引和正排索引

https://www.cnblogs.com/AndyStudy/p/9042032.html

倒排索引

ES第十天-索引原理那些事

倒排索引,就是把一个文档中的某个字段的内容进行分词,然后将这些分词去重唯一的形成一个列表,且每个分词都会记录着它所出现在的文档id号, 这样就会大大提高我们的查询效率

正排索引

ES第十天-索引原理那些事

正排索引和倒排索引恰恰相反,它记录的是每个doc中分别都有哪些分词,并且每个分词出现的次数。 这非常有利于我们做聚合查询。
那聚合查询倒排索引不行吗?
ES第十天-索引原理那些事

举个例子,如果需要统计“abc def” 的在全文档出现的count数,倒排索引要怎么做? 它会让“abc”和"def"分别去倒排索引里各自去找到自己所在,然后根据自己分词对应的文档数得到count值,但这个时间复杂度是O(n),随着分词量的增多,这个全表来一遍的次数也会随之增多。
正排索引呢? 撑死最多进行一次全记录扫描,就可以得到每个分词的count数了。

区别

ES第十天-索引原理那些事

ES第十天-索引原理那些事

倒排索引和正排索引大部分字段类型(有些默认正排索引不开启,比如text)基本都是会在index生成的时候随之生成的(但也因此生成index后无法再进行修改),也都会存储在磁盘上,当然如果你的内存比较充足,还会cache到内存中。

在创建index进行mapping设置的时候,如果明确字段需要做查询要创建倒排索引,那么要把index设为true(默认为true),
如果明确字段需要做聚合分析需要创建正排索引那么doc value要设置为true。如果确定字段不需要开启,可以设置不开启,这可以节省磁盘空间从而提高倒排索引的效率。

fielddata和doc values

es中还有一个东西 fielddata,它和doc values的功效一样,都是会创建聚合索引,但是差别很大: fielddata是在脚本执行的时候进行临时生成正排索引,并保存在JVM堆中(试想如果数据很大,那么需要占用多大内存),而doc value是使用的OS内存(堆外内存)。 因此fielddata实际不是一个特别好的选择,默认也是不开启的。

ES第十天-索引原理那些事

相关文章:

  • 2021-12-19
  • 2022-12-23
  • 2021-06-26
  • 2022-12-23
  • 2021-06-17
  • 2021-12-31
  • 2021-05-19
  • 2022-12-23
猜你喜欢
  • 2021-05-24
  • 2021-08-29
  • 2021-06-04
  • 2021-08-25
  • 2021-11-23
  • 2022-01-01
  • 2021-09-19
相关资源
相似解决方案