ES排序踩坑2

前言

在es检索时为了实现searchAfter,需要根据指定字段排序以实现正确的滚动

 

实际使用中,进行检索时使用的_id作排序,因为_id天然的唯一性可以实现准确滚动。结果发现filedData过高报警。

 

查阅官网,建议不要直接使用_id进行排序,而是将_id写入一个单独且启用doc_values的字段作排序。

官网原文:

The _id field is restricted from use in aggregations, sorting, and scripting. In case sorting or aggregating on the _id field is required, it is advised to duplicate the content of the _id field into another field that has doc_values enabled.

原文链接:

https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-id-field.html

 

原理:

filedData,在搜索时动态创建使用的jvm heap。缺点:当索引的文档数上千万后很容易导致内存占用很高,甚至直接OOM。优点:速度快。适用:text

doc_values,会在写入索引时就会创建在硬盘。优点:不会大量占用内存。缺点:速度相对较慢。适用:inteter/long/fload/double/date/text

使用_id排序默认用filedData。

 

优化方案:

将排序字段改为其他doc_values的字段。filedData降回正常

 

posted on 2022-04-13 16:55  Iversonstear  阅读(1099)  评论(0编辑  收藏  举报

导航