艺海无涯,学无止境。欢迎一起进行技术探讨,了解我

ElasticSearch es稀疏索引字段是否对性能有影响

对于索引和搜索都有性能影响!  Lucene的Post list是用文档id做delta编码压缩的,稀疏的数据会使得相邻文档id的delta值很大,post list压缩率降低,因此生成的索引文件增大。另外为了加快排序和聚合速度,ES还会为keyword,数值型一类的机构化字段构建列式存储结构doc values,根据字段类型,每个文档都会占用一块空间,即使是空值。 因此稀疏的数据,doc values的存储效率也会降低得很厉害,生成的索引文件也会比较大。 在文档数量多到一定程度时,写入和查询的速度都会下降得很厉害。

我理解lucene的post list是对应team字典的,里面存储的是id及位置信息等,最终通过跳跃表或者bitset进行查找,那么这个应该和字段多少没关系啊,有team才有值啊

post list的编码方式是Frame Of Reference。 编码效率取决于某个term的posting list里俩俩相邻的doc_id值的delta大小。 当文档比较稀疏的时候,虽然postling list的长度不会有变化,但是doc_id的delta会显著变大,编码需要的bit位数增加。

一个容易导致数据稀疏的例子就是用户将不同type的数据放进一个索引,当不同type数据的字段差异明显时,产生的索引文件大小, 比起将每个type单独放一个索引里产生的文件总和大小,要大得多。

理解了,稀疏意味着某个列的某个词对应的postling的id值可能差异比较大