我在使用扫描和滚动时遇到问题,因为扫描页面会返回奇怪的结果。我没有完全按照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);
}
}
有人可以向我解释为什么这不起作用,或者我做错了什么?
答案 0 :(得分:1)
你获得500而不是100的原因是因为searchHit总是
弹性搜索中的size * number_of_primary_shard。
参考:es site
答案 1 :(得分:1)
我遇到了同样的问题。页面必须不是null
,hasNext()
始终为真。 hasContent()
可以断言页面。将hasNext()
替换为hasContent()
,然后重试....
答案 2 :(得分:0)
我遇到了同样的问题,然后我认为我的代码和“工作示例”之间的区别在于我使用了page.hasNext()
,就像你上面那样。删除它,然后重试。