集計クエリを使用して Elastic Search インデックスを検索するための有効な cURL 要求があります。必要に応じて、応答には、指定された集計フィールドの値のリストと、これらの各値に一致するドキュメントの数が含まれます。たとえば、連絡先を郵便番号ごとに集計すると、応答には 50 の郵便番号と、これらの郵便番号ごとの連絡先の数が含まれます。偉大な。
これで、同じ集計クエリを実行する JAVA 関数も作成できました。集約応答でネストされたデータを解析するにはどうすればよいですか? 特に、各バケットの key 変数と docCount 変数を取り出したいと思います。オンラインや Elastic ドキュメントでこの例を見つけるのに苦労しています。
これが私がこれまでに持っているものです...
@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 は null です。home_zip 集計データをオブジェクトとして取得するにはどうすればよいですか? 私はこのElasticドキュメントで作業しています...
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 サーバー コードで実行したいと考えています。さらに、応答の一部が大きすぎてサーバーがクライアントに渡せないようです。では、Java でバケット キーと docCounts を解析するにはどうすればよいでしょうか?