2015-03-16 4 views
0

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?

Répondre

1

Exemple de travail d'analyse et faites défiler avec les données de printemps es se trouvent à TemplateTest Page

Raison vous obtenez 500 au lieu de 100 est parce que searchHit sera toujours

taille * number_of_primary_shard dans ElasticSearch.

ref: es site

+0

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. –

0

Je face à la même question, alors je me suis dit que la différence entre mon code, et le « exemple de travail », est que je page.hasNext(), comme vous l'avez fait ci-dessus. Supprimez-le et réessayez.

1

J'ai fait face au même problème. La page ne doit pas être null et hasNext() est toujours vraie. hasContent() peut affirmer la page. Remplacez hasNext() par hasContent() et réessayez ....