开发者社区 > 大数据与机器学习 > 检索分析服务 Elasticsearch版 > 正文

对于Elasticsearch,search after方式就没法使用了吗?

对于Elasticsearch,search after分页方式,使用es自身的“_id”字段作为排序字段时,报错:[fielddata] Data too large, data for [_id] would be [6334448731/5.8gb] 是什么原因?不允许用_id字段做排序吗?如果文档本身没有唯一值,search after方式就没法使用了吗?

展开
收起
想去床上睡觉 2024-07-03 15:02:21 80 0
1 条回答
写回答
取消 提交回答
  • 当在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内存使用率高问题的排查与处理方法
    image.png

    2024-07-03 16:14:16
    赞同 1 展开评论 打赏

阿里云检索分析服务Elasticsearch版兼容开源ELK功能,免运维全托管,提升企业数据检索与运维分析能力。

相关产品

  • 检索分析服务 Elasticsearch版
  • 热门讨论

    热门文章

    相关电子书

    更多
    阿里云Elasticsearch体系架构与特性解析 立即下载
    开源与云:Elasticsearch应用剖析 立即下载
    《Elasticsearch全观测解决方案》 立即下载