2016-11-30 3 views
1

In Elasticsearch 2.X, wenn ich für bestimmte Felder aus einer bestimmten Art in der Java-API abfragen wollte, habe ich so etwas tun könnte:Elasticsearch 5.0 Java erhalten bestimmte Felder

public List<String> getNames(String index, String type) { 
    List<String> names = new ArrayList<>(); 
    SearchResponse scrollResp = client.prepareSearch() 
     .setIndices(index) 
     .setTypes(type) 
     .addFields("my_name") 
     .setQuery(QueryBuilders.matchAllQuery()) 
     .setSize(10).execute().actionGet(); 
    for (SearchHit hit : scrollResp.getHits().getHits()) { 
     Map<String, SearchHitField> fields = hit.getFields(); 
     String name = fields.get("my_name").value(); 
     names.add(name); 
    } 
    return names; 
    } 

jedoch in ES 5.0 , die "addFields" -Methode ist weg. Es gibt etwas namens "addStoredField". Dies scheint jedoch nicht zu funktionieren, wenn Sie Ihre Felder im Mapping nicht explizit als gespeichert markiert haben. Stattdessen gibt "hit.getFields()" für den obigen Code einfach eine leere Menge von Feldern zurück (fields.size() == 0).

Wie bekomme ich die gleiche Funktionalität für 5.X wie für 2.X? Das heißt, bestimmte Felder aus den Ergebnissen abrufen, ohne sie explizit zu speichern ..?

Ich verwende hier den PreBuiltTransportClient als Client.

Antwort

1

Was ist, wenn Sie die .setFetchSource Methode, um die Felder zu definieren, verwenden, die Sie verwenden:

SearchResponse scrollResp = client.prepareSearch() 
     .setIndices(index) 
     .setTypes(type) 
     .setSearchType(SearchType.QUERY_AND_FETCH) 
     .setFetchSource(new String[]{"my_name"}, null) <--- your specific field 
     .setQuery(QueryBuilders.matchAllQuery()) 
     .setSize(10).execute().actionGet(); 

Sie könnten diese SO einen Blick über als auch haben.

Verwandte Themen