ElasticsearchTemplate检索大数据集

时间:2017-09-04 06:26:22

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

我是ElasticsearchTemplate的新手。我想根据我的查询从Elasticsearch获取1000个文档。 我使用QueryBuilder来创建我的查询,它工作得很好。 我已经浏览了以下链接,其中指出可以使用扫描和滚动来实现大数据集。

link one
link two

我正在尝试在下面的代码部分中实现此功能,我已从上面提到的链接之一复制粘贴。 但是我收到了以下错误:

The type ResultsMapper is not generic; it cannot be parameterized with arguments <myInputDto>.

MyInputDto是一个在我的项目中带有@Document注释的类。 在一天结束时,我只想从Elasticsearch检索1000个文档。 我试图找到size参数,但我认为它不受支持。

String scrollId = esTemplate.scan(searchQuery, 1000, false);
        List<MyInputDto> sampleEntities = new ArrayList<MyInputDto>();
        boolean hasRecords = true;
        while (hasRecords) {
            Page<MyInputDto> page = esTemplate.scroll(scrollId, 5000L,
                    new ResultsMapper<MyInputDto>() {
                        @Override
                        public Page<MyInputDto> mapResults(SearchResponse response) {
                            List<MyInputDto> chunk = new ArrayList<MyInputDto>();
                            for (SearchHit searchHit : response.getHits()) {
                                if (response.getHits().getHits().length <= 0) {
                                    return null;
                                }
                                MyInputDto user = new MyInputDto();
                                user.setId(searchHit.getId());
                                user.setMessage((String) searchHit.getSource().get("message"));
                                chunk.add(user);
                            }
                            return new PageImpl<MyInputDto>(chunk);
                        }
                    });
            if (page != null) {
                sampleEntities.addAll(page.getContent());
                hasRecords = page.hasNextPage();
            } else {
                hasRecords = false;
            }
        }

这是什么问题? 有没有其他替代方法来实现这一目标? 如果有人能告诉我这个(代码)如何在后端工作,我将感激不尽。

1 个答案:

答案 0 :(得分:1)

解决方案1 ​​

如果您想使用<ItemGroup> <None Update="example.txt" CopyToPublishDirectory="PreserveNewest" CopyToOutputDirectory="PreserveNewest"/> </ItemGroup> ,使用ElasticsearchTemplate会更加简单易读,因为它允许使用CriteriaQuery方法设置页面大小。通过滚动,您可以获得下一组数据:

setPageable

解决方案2

如果您想使用CriteriaQuery criteriaQuery = new CriteriaQuery(Criteria.where("productName").is("something")); criteriaQuery.addIndices("prods"); criteriaQuery.addTypes("prod"); criteriaQuery.setPageable(PageRequest.of(0, 1000)); ScrolledPage<TestDto> scroll = (ScrolledPage<TestDto>) esTemplate.startScroll(3000, criteriaQuery, TestDto.class); while (scroll.hasContent()) { LOG.info("Next page with 1000 elem: " + scroll.getContent()); scroll = (ScrolledPage<TestDto>) esTemplate.continueScroll(scroll.getScrollId(), 3000, TestDto.class); } esTemplate.clearScroll(scroll.getScrollId()); 代替org.elasticsearch.client.Client,则ElasticsearchTemplate允许设置要返回的搜索匹配数:

SearchResponse