当前位置: 首页 > 知识库问答 >
问题:

带Pageable的Spring data elasticsearch存储库只重新调整了10000个文档

隗和裕
2023-03-14

我在elasticsearch中有17364个文档的索引。

$curl http://localhost:9200/performance/_count
{"count":17364,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0}}

Spring数据存储库,

public interface TestRepository extends ElasticsearchRepository<Transaction, String> {
}

逐页获取所有文档并打印:

public void testReport() {

  int page = 0, pageSize = 1000;
  Pageable of = PageRequest.of(page, pageSize);

  Page<Transaction> all = testRepository.findAll(of);
  int numberOfPages = all.getTotalPages();

  log.info("All pages: {},  {}", numberOfPages, all.getTotalElements());
  do {
     log.info("Current page: {}, {}", of.getPageNumber(), of.getPageSize());
     for (Transaction txn : all) {
        log.info(mapper.writeValueAsString(txn));
     }
  } while ((of = of.next()) != null && (transactionRepository.findAll(of)) != null);

}

这段代码只返回10000个文档,尽管索引中有17364个文档。你能帮我找出为什么会这样吗。

  • ElasticSearch版本:7.9

共有1个答案

宫亦
2023-03-14

我看到两种选择:

答:由于您只有17364个文档,因此可以增加索引。max_result_window将索引设置为(例如)20000,以便可以分页到最后:

PUT performance/_settings
{
  "index.max_result_window": 20000
}

B.如果你有更大的索引和/或增加索引。max_result_window出于任何原因,限制都不是一个选项,那么您需要利用Scroll API。Spring Data ES支持两种方法。

第一种方法涉及利用ElasticsearchTemplate。searchForStream()方法,该方法在内部使用Scroll API

SearchHitsIterator<Transaction> stream = elasticsearchTemplate.searchForStream(searchQuery, Transaction.class, "performance");

第二种方法更低级。您需要使用返回流的方法修改存储库定义

public interface TestRepository extends ElasticsearchRepository<Transaction, String> {
    Stream<Transaction> findScrollAll();
}

然后使用Elasticsearch chTemplate实现该方法。search chScrollStart()Elasticsearch chTemplate. search chScroll继续()

补充:

第三种选择:

定义一个方法

Stream<Searchhit<Transaction>> searchBy()

在您的Testrepository中。或者只使用返回类型

 类似资料:
  • 问题内容: 我正在将Jenkins管道插件与Jenkinsfile一起使用。 在一个名为vms.git的存储库中,我有Jenkinsfile及其构建的应用程序。 我还有一个名为deploy.git的存储库,其中包含我想用于在vms.git中部署应用程序的脚本。 目前,我的Jenkinsfile看起来像这样 并且我在作业配置中定义了vms.git存储库。 因此,我想做的是检出两个存储库,然后使用vm

  • 我正在使用Jenkins管道插件和Jenkins文件。 在一个名为vms的存储库中。git,我有Jenkinsfile和它构建的应用程序。 我有另一个名为deploy的存储库。git,其中包含我想用于在VM中部署应用程序的脚本。吉特。 目前我的Jenkinsfile就是这样的 我正在作业配置中定义vms.git存储库。 所以我想做的是检查这两个存储库,然后在vms中使用Jenkinsfile。gi

  • 我查阅了许多存储库设计模式教程,如 https://asperbrothers.com/blog/implement-repository-pattern-in-laravel/ https://www.larashout.com/how-to-use-repository-pattern-in-laravel https://laravelarticle.com/repository-desig

  • http://maven.apache.org/maven-v4_0_0.xsd“> 正如u提到的,我在mvnrepository.com/artifact/org.databene/benerator-maven-plugin/…找到了新的存储库,试图编辑POM,但得到的错误为 [警告]org.databene:benerator-maven-plugin:jar:jar的POM丢失,没有可用的

  • 我在数据库里有一些文本。我用法语和英语。法语有口音,还有一些特殊的字符,如。我使用Mamp、MySQL和PHP。 我有latin1_swedish-ci排序规则(默认)。我尝试了,结果是一样的。如果我在html页面中使用,我会在标题中使用: