倒排索引和正排索引
https://www.cnblogs.com/AndyStudy/p/9042032.html
倒排索引
倒排索引,就是把一个文档中的某个字段的内容进行分词,然后将这些分词去重唯一的形成一个列表,且每个分词都会记录着它所出现在的文档id号, 这样就会大大提高我们的查询效率
正排索引
正排索引和倒排索引恰恰相反,它记录的是每个doc中分别都有哪些分词,并且每个分词出现的次数。 这非常有利于我们做聚合查询。
那聚合查询倒排索引不行吗?
举个例子,如果需要统计“abc def” 的在全文档出现的count数,倒排索引要怎么做? 它会让“abc”和"def"分别去倒排索引里各自去找到自己所在,然后根据自己分词对应的文档数得到count值,但这个时间复杂度是O(n),随着分词量的增多,这个全表来一遍的次数也会随之增多。
正排索引呢? 撑死最多进行一次全记录扫描,就可以得到每个分词的count数了。
区别
倒排索引和正排索引大部分字段类型(有些默认正排索引不开启,比如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实际不是一个特别好的选择,默认也是不开启的。