gpt4 book ai didi

java - Hibernate OGM 分页滚动

转载 作者:行者123 更新时间:2023-12-01 16:46:22 27 4
gpt4 key购买 nike

假设我们有一个巨大的 mongodb 集合(大约 60,000,000 条记录),并且我们希望滚动它,当然不想获取大量内存。对于 Hibernate orm 来说,这是可能的,因为有滚动 api 和条件查询,但是 OGM 中分页的解决方案是什么(已经花了很多时间,但我找不到东西)?我使用 setFirstResult-setMaxResult Api 批量索引 50,000 个对象。这些是从查询中获取批处理的时间(以秒为单位),例如

em.createNativeQuery(query, Entity.class).setFirstResult(i).setMaxResults(batchSize).getResultList()
results.stream().forEach(res -> fullTextEntityManager.index(res));

通过在每次迭代中增加 i ,例如 i+=batchSize;

我已经尝试使用 OgmMassIndexer,但我需要能够启动-停止、索引​​特定范围,所以我更喜欢手动执行。

显而易见且合乎逻辑的是,每次迭代中查找第一个结果的时间正在增加。这里我有时间以秒为单位从400万开始找到下一批50000(setFirstResult(4000000).setMaxResult(50000)):

例如。到 4000000 需要 17 秒等。 到 4050000 需要 15 秒等。 到 4100000 需要 12 秒等。但后来这个数字增加了很多:

发现:17找到:15找到:12找到:13找到:13找到:13找到:15找到:16找到:16发现: 17找到:18找到:18发现: 19发现: 19找到:20找到:20找到: 21找到: 21找到:22找到: 21找到:22找到:23找到:23找到:23找到: 24找到: 24找到:25找到:25找到: 26找到: 26找到: 27找到: 28找到: 27找到: 29找到: 29找到:30找到: 31找到: 32找到: 33找到:30找到: 33找到: 32找到:34找到:34找到:35找到:35找到: 38找到:36找到: 38找到:36找到: 41找到: 41找到: 39找到: 41找到: 41找到:40找到: 42找到: 43找到: 42找到:44找到:44找到:45找到: 47找到:45找到:44找到:44找到: 47找到:44找到: 47找到: 47找到:50找到: 52找到:93

有没有使用 ogm 游标滚动 mongodb 或其他东西来获取 session 中的对象并有效地索引它们的选项?我的意思是,即使对于想要在不使用 Hibernate Search 的情况下使用 OGM 对大量数据进行分页的应用程序来说,这也是不可行的,所以我想有一个我看不到的解决方案。

非常感谢。

使用 ElasticSearch 的 Hibernate OGM 5.3.1、Hibernate Search 5.9.0

最佳答案

OGM 尚不支持滚动,因为它需要不受支持的 Criteria API。

话虽这么说,您可以以不同的方式实现您的流程。

我假设这个过程变得越来越慢来自查询部分(MongoDB 越来越难找到第 N 个结果),而不是来自索引部分(Elasticsearch 越来越难将文档添加到索引)。

如果是这种情况,您可以尝试“分块”查询而不是分页。这个想法是首先检索要索引的实体类型的第一个和最后一个 ID,然后不使用分页,而是使用类似于 where ID between <last ID in the previous query + 1> AND <last ID in the previous query + page size> 的条件运行查询。 .

假设 ID 字段在 MongoDB 中具有升序索引,这应该可以避免性能随着时间的推移而变差。

关于java - Hibernate OGM 分页滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49799883/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com