J'ai des problèmes en utilisant l'analyse et le défilement comme les pages de numérisation retournent résultat étrange. Je ne les utilise pas exactement comme indiqué dans le documentation. Dans la méthode getAllExampleItems() J'ai une boucle while sur la méthode "page.hasNext()", qui retourne toujours false. La raison de cela est la Pageable de la requête de recherche n'est pas définie sur la page de résultats, et le nombre de pages est donc toujours 1. Une autre chose qui est bizarre est que je définis 100 comme la taille du résultat et en récupérer 500! N'est-ce pas un bug ou qu'est-ce que je fais mal? Ceci est un exemple de service:L'analyse élastique de recherche de données de ressort et le résultat paginé de défilement ne fonctionnent pas?
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);
}
}
Quelqu'un pourrait-il me expliquer pourquoi cela ne fonctionne pas, ou ce que je fais mal?
Il est agréable d'avoir quelqu'un qui regarde le problème, mais vous ne répondez pas à la question principale. Je connais l'exemple de "travail", comme je l'ai écrit. La question est pourquoi page.hasNext() ne fonctionne pas comme prévu? L'explication de la taille est probablement vraie, mais étrange car les données Spring définissent la taille et ne dépendent pas du nombre de fragments présents. –