2015-05-27 19 views
9

Sto utilizzando l'API Java per Elasticsearch. Avendo salvato le entità in indici, è possibile recuperarle insieme alla fonte completa. Tuttavia, voglio solo recuperare i campi selezionati, e questo non funziona.Recupero di campi specifici utilizzando l'API Java Elasticsearch

Il codice di esempio folowing:

SearchResponse response = client.prepareSearch("my-index") 
    .setTypes("my-type") 
    .setSearchType(SearchType.QUERY_AND_FETCH) 
    .setFetchSource(true) 
    .setQuery(QueryBuilders.termsQuery("field1", "1234")) 
    .addFields("field1") 
    .execute() 
    .actionGet(); 

for (SearchHit hit : response.getHits()){ 
    Map<String, SearchHitField> fields = hit.getFields(); 
    System.out.println(fields.size()); 
    Map map = hit.getSource(); 
    map.toString(); 
} 

sarà recuperare le entità corretti dall'indice, compreso il sorgente completo.

Ad esempio, questo è un frammento della risposta:

"hits" : { 
    "total" : 1301, 
    "max_score" : 0.99614644, 
    "hits" : [ { 
    "_index" : "my-index", 
    "_type" : "my-type", 
    "_id" : "AU2P68COpzIypBTd80np", 
    "_score" : 0.99614644, 
    "_source":{"field1":"1234", ...}]} 
}, { 

Tuttavia, mentre response.getHits() restituisce il numero atteso di colpi, il fields e source all'interno di ogni colpo è vuoto.

mi aspetto ogni colpo per contenere il campo specificato nella riga:

.addFields("field1") 

Commentando la linea

.setFetchSource(true) 

farà sì che la risposta non includere la fonte a tutti.

La versione di elasticsearch è 1.5.0

Quello che segue è l'esperto di dipendenza API Java:

<dependency> 
    <groupId>com.sksamuel.elastic4s</groupId> 
    <artifactId>elastic4s_2.11</artifactId> 
    <version>1.5.5</version> 
</dependency> 

obiously, per motivi di prestazioni, non voglio avere per recuperare la completa entità. Qualcuno sa come limitare il recupero ai campi selezionati? Grazie

risposta

30

È possibile specificare i campi necessari utilizzando setFetchSource(String[] includes, String[] excludes) method. Prova a modificare la

SearchResponse response = client.prepareSearch("my-index") 
    .setTypes("my-type") 
    .setSearchType(SearchType.QUERY_AND_FETCH) 
    .setFetchSource(new String[]{"field1"}, null) 
    .setQuery(QueryBuilders.termsQuery("field1", "1234")) 
    .execute() 
    .actionGet(); 

for (SearchHit hit : response.getHits()){ 
    Map map = hit.getSource(); 
    map.toString(); 
} 

map conterrà solo i campi che hai specificato.

Si noti che .setFetchSource("field1", null) (se è necessario un campo singolo) o .setFetchSource("field*", null) (se sono necessari più campi con caratteri jolly) funzionerebbe anche.

+3

@ user1052610 sei riuscito a utilizzare la soluzione suggerita? – Val

+0

Non ha funzionato per me con ElasticSearch 5.x. :( Restituisce un campo vuoto "_source" nella risposta e non copia "campo1" come un campo reale – cs94njw

+0

@ cs94njw Questo non dovrebbe essere cambiato [secondo la fonte] (https: // github. com/elastico/elasticsearch/blob/c98e3f60f78fb47ae7482d96952f2dbabd1d6d49/core/src/main/java/org/elasticsearch/action/get/GetRequestBuilder.java # L127-L131). Sentiti libero di creare una nuova domanda facendo riferimento a questo, quindi possiamo ordinare fuori. – Val

Problemi correlati