1

エラスティックサーチに以下のフィールドがあります

"_source": {
"@timestamp": 
"cpu_stat_s": {
"temp_in_celsius":
"model_name":,
"cpu_MHz_String": ,
"cache_size_string": 
},

"memory_stat_s": {
"total_memory": ,
"swap_total": ,
"swap_free": ,
"used": ,
"free": ,
"swap_used": 
},
"process_stat_s": [
{
"process_name": ,
"mem_in_use":,
"process_pid": 
}
]

java apiを使用してelasticsearchからcpu_stat_sおよびmemory_stat_sフィールドを取得したいだけです。クエリフィルターを検索し、また実行しました

String source="{\"query\":\"ether_stat_s\"}";

SearchResponse response = client.prepareSearch("cn_*")
                       .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
                        .setFrom(0).setSize(10).setExplain(true)
    .setPostFilter(FilterBuilders.rangeFilter("@timestamp").from(TIMESTAMP_FROM).to(TIMESTAMP_TO)).**setSource(source).**execute().actionGet();

しかし、必須フィールドではなく、すべてのフィールドを受け取りました。

すべてのフィールドを取得してから for ループを使用し、応答からソースを取得することでこれを行うことができますが、数十億のレコードの場合は CPU 時間が増加します。私を助けることができた

4

1 に答える 1

0

最後にさらに調査した後、答えを見つけました

SearchResponse response = client.prepareSearch("cn_*")
                       .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
                        .setFrom(0).setSize(10).setExplain(true)
                        .setPostFilter(FilterBuilders.rangeFilter("@timestamp").from(TIMESTAMP_FROM).to(TIMESTAMP_TO))
                        .setFetchSource(new String[]{"ether_stat_s"}, null)
                        .execute()
                       .actionGet();
于 2015-08-09T11:40:21.287 に答える