Запрос агрегации с использованием Elasti c REST-клиент высокого уровня поиска для JAVA - PullRequest
1 голос
/ 09 марта 2020

У меня есть рабочий запрос cURL для поиска в Elasti c Индекс поиска с запросом агрегации При желании в ответ включается список значений для указанного поля агрегации и количество документов, соответствующих каждое из этих значений. Например, я объединяю контакты по почтовому индексу, и ответ включает в себя 50 почтовых индексов с количеством контактов в каждом из этих почтовых индексов. Отлично.

Теперь я также написал функцию JAVA, которая выполняет тот же самый запрос агрегации. Как я могу разобрать данные, вложенные в ответ агрегации? В частности, я хотел бы вытащить переменные key и docCount каждого сегмента. У меня возникают проблемы с поиском примеров этого в Интернете и в документации Elasti c.

Вот что у меня есть ...

@GET
@Path("{indexName}")
public void searchResults(@PathParam("indexName") String indexName) throws IOException {
    RestHighLevelClient client = createHighLevelRestClient();
    int numberOfSearchHitsToReturn = 100; // defaults to 10

    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

    sourceBuilder.size(numberOfSearchHitsToReturn);

    GlobalAggregationBuilder aggregation = AggregationBuilders.global("agg")
            .subAggregation(AggregationBuilders.terms("home_zip_aggregation").field("home_zip.keyword"));

    sourceBuilder.aggregation(aggregation);


    SearchRequest searchRequest = new SearchRequest(indexName).source(sourceBuilder);

    SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

    Aggregations aggregations = searchResponse.getAggregations();
    Terms byZipAggregation = aggregations.get("home_zip");
    System.out.print(byZipAggregation);
    System.out.print(searchResponse);

    client.close();

}

searchResponse действительно содержит список совокупностей. Тем не менее, byZipAggregation является нулевым. Как я могу получить данные агрегации home_zip как объект? Я работаю с этой документацией Elasti c ...

https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/_bucket_aggregations.html

Вот значение searchResponse:

{"took":7,"timed_out":false,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0},"hits":{"total":{"value":51,"relation":"eq"},"max_score":1.0,"hits":[{"_index":"contacts_6_cjluhmdki6","_type":"_doc","_id":"2093","_score":1.0,"_source":{"list_id":"6","contact_id":"2093","firstname":"DANIEL","middlename":"C","lastname":"BRYANT","email":"","home_address1":"602  STONE CIRCLE CT APT 2","home_city":"SCHAUMBURG","home_state":"IL","home_zip":"60194","home_phone":"","latitude":"42.030346","longitude":"-88.06422","location_point":"0101000020E6100000F2EF332E1C0456C03FC8B260E2034540","date_of_birth":"10/26/1991","sex":"M","registered_party":"0","created":"2019-11-13 21:24:55.825672","imported":"2019-11-13 15:24:51.006805","fulltext":"'2':8 '60194':10 '602':3 'apt':7 'bryant':2 'circle':5 'ct':6 'daniel':1 'schaumburg':9 'stone':4","home_house_num":"602","home_street_name":"STONE CIRCLE","home_street_type":"CT","home_unit_num":"APT 2","fake_col":"0.414"} ... 

Дополнительные данные документа были здесь. Я удалил его, чтобы сократить этот пример.

}}]},"aggregations":{"global#agg":{"doc_count":51,"sterms#home_zip_aggregation":{"doc_count_error_upper_bound":0,"sum_other_doc_count":38,"buckets":[{"key":"60462","doc_count":2},{"key":"60506","doc_count":2},{"key":"60005","doc_count":1},{"key":"60030","doc_count":1},{"key":"60061","doc_count":1},{"key":"60098","doc_count":1},{"key":"60102","doc_count":1},{"key":"60126","doc_count":1},{"key":"60137","doc_count":1},{"key":"60187","doc_count":1}]}}}}

Я заметил, что можно передать весь объект Aggregations нашему клиентскому коду, который написан в Javascript, а затем проанализировать нужные поля в коде Javascript. Однако мы бы хотели выполнить весь этот анализ в серверном коде Java, чтобы мы не передавали ненужные данные клиенту. Более того, кажется, что некоторые ответы слишком велики для нашего сервера, чтобы передать их клиенту. Итак, как я могу разобрать ключи корзины и docCounts в Java?

...