我在使用扫描和滚动时遇到问题,因为扫描页面返回奇怪的结果。我没有完全按照文档中的说明使用它们。在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);
}
}
有人可以向我解释为什么这不起作用,或者我做错了什么?