【问题标题】:findAllByX incorrectly limited to 10 resultsfindAllByX 错误地限制为 10 个结果
【发布时间】:2015-02-07 22:04:31
【问题描述】:

在 Spring Data Elasticsearch 中 - 我注意到生成的 findAllByFoo 类型方法看起来像一个错误。 这些似乎仅限于默认大小(10 - 这与您对 findAll 操作的语义相违背。

主要的findAll() 操作确实可以正常工作,但确实会返回所有文档。

那么 - 这是一个错误还是我遗漏了什么? 干杯, 欧根。

【问题讨论】:

    标签: elasticsearch spring-data spring-data-elasticsearch


    【解决方案1】:

    它看起来不像一个错误。

    根据 elasticsearch 的文档 (from/size),看起来 10 是 elasticsearch 从搜索查询返回的默认结果数。

    您可以使用适当的 Pageable 参数修改页面大小,例如:

    Page<User> users = repository.findAll(new PageRequest(1, 20))
    

    【讨论】:

    • 这是有道理的——我就是这样解决它的。但是,这是一个 findAll 操作,所以我的想法是,当我查看该 API 时,我希望返回所有实体。所以基本上我希望 Spring Data 生成一个可以做到这一点的查询。但是 - 如果我没有遗漏什么,那就是 :) 谢谢。
    • @Eugen 在我看来,“findAll”操作返回数据库上下文中的每条记录是有意义的,但由于 Elasticsearch 在搜索上下文中运行,它只是意味着“无条件搜索”,并且与任何其他搜索具有相同的默认结果限制。
    • 嗯,当然,但考虑到这里的主要用例是存储,重点是使用弹性搜索作为存储系统,不仅(或不主要)用于搜索 - 我更愿意拥有它表现得像这样。
    【解决方案2】:

    根据https://jira.spring.io/browse/DATAES-58,它按设计工作,不会更改。阅读本期的cmets,了解性能背景。

    【讨论】:

      【解决方案3】:

      您可以使用ElasicsearchTemplate 搜索多个节点并提供所需的pageRequest(或结果)数。默认值为 10。

      @Autowired
      private ElasticsearchTemplate elasticsearchTemplate;    
      
      public List<MyElasticDocument> getData() {
      
          String textToSearch = "John";
      
          QueryBuilder query = QueryBuilders.boolQuery()
                  .should(
                          QueryBuilders.queryStringQuery(textToSearch)
                                  .lenient(true)
                                  .field("jsonNode1")
                  )
                  .should(
                          QueryBuilders.queryStringQuery(textToSearch + "*")
                                  .lenient(true)
                                  .field("jsonNode2")
                                  .field("jsonNode3")
                  );
      
          NativeSearchQuery build = new NativeSearchQueryBuilder()
                  .withQuery(query)
                  .withPageable(new PageRequest(0, 20)) // provide the no. of results you want
                  .build();
      
          List<MyElasticDocument> elasticDocumentList = elasticsearchTemplate.queryForList(build, MyElasticDocument.class)
      
          return elasticDocumentList;
      }
      

      【讨论】:

        猜你喜欢
        • 2014-03-27
        • 2017-05-07
        • 1970-01-01
        • 1970-01-01
        • 2023-02-18
        • 1970-01-01
        • 2012-04-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多