0

我在使用扫描和滚动时遇到问题,因为扫描页面返回奇怪的结果。我没有完全按照文档中的说明使用它们。在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);
     }
}

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

4

3 回答 3

1

可以在TemplateTest 页面找到使用 Spring 数据 es 进行扫描和滚动的工作示例

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

弹性搜索中的大小 * number_of_primary_shard。

参考:es网站

于 2015-04-07T14:35:36.667 回答
1

我遇到了同样的问题。页面必须不是null并且hasNext()总是正确的。hasContent()可以断言页面。替换hasNext()hasContent()并重试....

于 2017-06-06T03:25:53.373 回答
0

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

于 2015-06-15T22:07:07.783 回答