Я использую elasticsearch версии 6.4.2
Мне удалось создать запрос GET с помощью REST API, теперь я хотел бы выполнить тот же запрос с помощью JAVA api.
Это запрос:
GET _search
{
"query":{
"bool":{
"must":{
"match":{
"tags":"kpi"
}
},
"filter":{
"range":{
"@timestamp":{
"gt":"now-5m"
}
}
}
}
}
}
Я прочитал эту документацию: https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-compound-queries.html, но мне все еще не ясно, ищу ли я это и как его использовать. Учтите, что запрос может вернуть много результатов, которые должны быть обработаны моим Java-приложением.
Кроме того, поскольку я должен выполнять этот запрос каждые 5 минут, как я могу его оптимизировать (если это возможно)?
@Val, я думаю, что принятый ответ не так хорош, как другой! так что я хочу дать ему награду!
Попался, значит, у вас уже есть ответ, отлично ;-)




Если ваш проект основан на maven, вы можете использовать клиентскую зависимость elasticsearch:
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>5.6.2</version>
</dependency>
ваш необходимый запрос будет:
val query = QueryBuilders.boolQuery()
.must(
QueryBuilders.rangeQuery("timestamp").from(startDate)
)
.must(
QueryBuilders.termQuery("tags", "kpi")
)
и, наконец, для выполнения вашего запроса вы можете использовать client.search(query). client относится к типу RestHighLevelClient.
Вот точный код, который работает:
Date dateFrom = new Date(System.currentTimeMillis() - 300 * 1000);
Date dateTo = new Date(System.currentTimeMillis());
BoolQueryBuilder query = QueryBuilders.boolQuery()
.must(QueryBuilders.rangeQuery("@timestamp").from(dateFrom).to(dateTo))
.must(QueryBuilders.matchQuery("tags", "kpi"));
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(query);
SearchRequest searchRequest = new SearchRequest();
searchRequest.source(searchSourceBuilder);
System.out.println(query.toString());
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
logger.log(Level.INFO, "Status: {0}", new Object[] { searchResponse.status() });
logger.log(Level.INFO, "Took: {0}", new Object[] { searchResponse.getTook() });
logger.log(Level.INFO, "IsTerminatedEarly: {0}", new Object[] { searchResponse.isTerminatedEarly() });
logger.log(Level.INFO, "TimedOut: {0}", new Object[] { searchResponse.isTimedOut() });
logger.log(Level.INFO, "TotalShards: {0}", new Object[] { searchResponse.getTotalShards() });
logger.log(Level.INFO, "SuccessfulShards: {0}", new Object[] { searchResponse.getSuccessfulShards() });
logger.log(Level.INFO, "FailedShards: {0}", new Object[] { searchResponse.getFailedShards() });
logger.log(Level.INFO, "Total Hits: {0}", new Object[] { searchResponse.getHits().getTotalHits() });
@Spara, можешь объяснить, что еще тебе нужно?