对于Elasticsearch,search after分页方式,使用es自身的“_id”字段作为排序字段时,报错:[fielddata] Data too large, data for [_id] would be [6334448731/5.8gb] 是什么原因?不允许用_id字段做排序吗?如果文档本身没有唯一值,search after方式就没法使用了吗?
当在Elasticsearch中使用search_after分页方式,并尝试以_id字段作为排序依据时,遇到“[fielddata] Data too large”错误,这是因为_id字段默认并不启用fielddata。当对一个字段进行排序或聚合操作时,Elasticsearch需要将该字段的值加载到内存(即fielddata)中,对于基数高(即具有许多不同值)的字段,这可能会非常消耗内存。显然_id字段在大型索引中会是高基数的,因此可能导致内存溢出。
不允许用_id字段做排序吗?
并不是不允许,而是不推荐直接使用_id进行排序,特别是当数据量大时,因为这会消耗大量内存。但可以通过间接方式实现,比如创建一个带有doc_values属性的额外字段,将_id的值复制到这个字段中,因为doc_values支持排序且更内存高效。
如果文档本身没有唯一值,search after方式就没法使用了吗?
对于search_after,问题不在于文档是否有唯一值,而在于如何高效排序。即使文档中其他字段可能有重复值,search_after依然可以使用,只要排序字段适合分页场景即可。关键是要避免使用会导致大量内存使用的字段,比如未经优化的_id排序。确保排序字段支持高效排序和分页,比如使用keyword类型的字段或者特地为分页优化的字段。如果没有合适的唯一值字段,可以考虑为分页需求设计一个唯一排序标识符。
可参考fielddata内存使用率高问题的排查与处理方法
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。