2016-11-30 3 views
1

В ElasticSearch 2.X, когда я хотел запросить конкретных полей из определенного типа в API Java, я мог бы сделать что-то вроде этого:ElasticSearch 5.0 Java получить определенные поля

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; 
    } 

Однако в ES 5.0 , метод «addFields» исчез. Существует нечто, называемое «addStoredField». Однако это, похоже, не работает, если вы явно не помечены ваши поля в сопоставлении как хранятся. Скорее «hit.getFields()» для приведенного выше кода просто возвращает пустой набор полей (fields.size() == 0).

Как достичь такой же функциональности для 5.X, как и для 2.X? То есть, получить конкретные поля из результатов, без явного хранения их ..?

Я использую PreBuiltTransportClient в качестве клиента здесь.

ответ

1

Что делать, если вы используете метод .setFetchSource для того, чтобы определить поля, которые вы используете:

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(); 

Вы могли бы посмотреть по этой SO, а также.

Смежные вопросы