Spring数据elasticsearch扫描和滚动分页结果不起作用?

时间:2015-03-16 15:08:32

标签: java spring-data-elasticsearch

我在使用扫描和滚动时遇到问题,因为扫描页面会返回奇怪的结果。我没有完全按照documentation中的规定使用它们。 在 getAllExampleItems()方法中,我在" page.hasNext()"上有一个while循环。方法,总是返回false。原因是搜索查询中的Pageable没有在结果页面上设置,因此页面总数为1.另一件奇怪的事情是我将100设置为结果大小并获得500!不是一个错误或我做错了什么? 这是一个示例服务:

package service;

import config.ElasticSearchConfig;
import items.ExampleItem;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.query.IndexQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.data.elasticsearch.core.query.SearchQuery;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import static org.elasticsearch.index.query.FilterBuilders.typeFilter;
import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;

@Service
public class ExampleService {

@Autowired
private ElasticsearchTemplate searchTemplate;


public List<ExampleItem> getAllExampleItems() {
    List<ExampleItem> allItems = new ArrayList<>();
    String scrollId = searchTemplate.scan(exampleItemSearchQuery(), 1000, false);
    Page<ExampleItem> page = searchTemplate.scroll(scrollId, 5000L, ExampleItem.class);
    if (page != null && page.hasContent()) {
        allItems.addAll(page.getContent());
        while (page != null && page.hasNext()) {
            page = searchTemplate.scroll(scrollId, 5000L, ExampleItem.class);
            if (page != null && page.hasContent()) {
                allItems.addAll(page.getContent());
            }
        }
    }
    return allItems;
}


private SearchQuery exampleItemSearchQuery() {
    return new NativeSearchQueryBuilder()
            .withQuery(matchAllQuery())
            .withFilter(typeFilter("exampleitem"))
            .withPageable(new PageRequest(0, 100))
            .build();
}


public void saveAllExampleItems(List<ExampleItem> items) {
         List<IndexQuery> indexQueries = new ArrayList<>();
         for (ExampleItem item : items) {
             IndexQuery qry = new IndexQuery();
             qry.setId(item.getId());
             qry.setObject(item);
             qry.setIndexName(ElasticSearchConfig.ITEMS);
             indexQueries.add(qry);
         }
         searchTemplate.bulkIndex(indexQueries);
         searchTemplate.refresh(ExampleItem.class, true);
     }
}

有人可以向我解释为什么这不起作用,或者我做错了什么?

3 个答案:

答案 0 :(得分:1)

可以在TemplateTest Page

找到使用Spring数据进行扫描和滚动的工作示例

你获得500而不是100的原因是因为searchHit总是

弹性搜索中的

size * number_of_primary_shard。

参考:es site

答案 1 :(得分:1)

我遇到了同样的问题。页面必须不是nullhasNext()始终为真。 hasContent()可以断言页面。将hasNext()替换为hasContent(),然后重试....

答案 2 :(得分:0)

我遇到了同样的问题,然后我认为我的代码和“工作示例”之间的区别在于我使用了page.hasNext(),就像你上面那样。删除它,然后重试。