关于数据插入ES去重的问题,一直在寻找解决办法,最笨的方法就是每次插入前进行查询,这种方法的优点就是能够保证数据在ES索引中是唯一的,缺点就是每次插入前都进行查询有些浪费时间,并不是大多数文档插入都会重复
方法一
将文档哈希作为文档在索引中的 _id
值,同时插入时op_type
设置为 create
,
优点:这样可以避免每次插入都查询,_id重复的文档不需要提前查询,ES会跳过该文档
缺点:实验验证,不同分片shard
中还是会存在相同_id
值,只能够解决同一个 shard
中的重复问题
方法二
在数据检索阶段使用折叠字段(collapse) 的方法对检索结果去重
这种方法不需要在存储中对数据进行去重,只需要指定字段对结果进行折叠,就可以达到查询时没有重复文档的效果
结论
上述两种方法应该结合起来,第一种方法在物理存储中,尽量减少重复文档,第二种方法在第一种方法的基础上,在查询阶段去掉重复文档,可以达到最高效率。
ES 除了在插入前查询的方式,还没有找到一种方法能够做到存储阶段完成完美的去重,因此 collapse 字段折叠的使用是目前能够找到的最优解