Запрос Elasticsearch через Java API
Я использую следующий запрос эластичного поиска, чтобы получить детали,
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"bool": {
"should": [
{"match": {
"val": "GET"
}}]
}
}
}
}
}
Он работает нормально и дает результат по мере необходимости.
Я хочу выполнить тот же запрос через Java и получить те же результаты и пробовал следующее,
getClient().prepareSearch(esIndex)
.setQuery(QueryBuilders.queryStringQuery(QUERY)).execute().actionGet();
Он не возвращает данные и выдает неправильный формат для некоторого формата запроса.
Есть ли доступный API Java, с помощью которого можно выполнить тот же запрос?
ПРИМЕЧАНИЕ. Существует возможность создавать конструкторы boolquery и агрегатора в Java API и выполнять их. Мне просто любопытно, чтобы найти способ выполнить этот запрос напрямую через Java-API эластичного поиска
3 ответа
Если вы действительно хотите использовать Query String Query, ваш запрос должен соответствовать Query String Syntax:
getClient().prepareSearch(esIndex)
.setQuery(QueryBuilders.queryStringQuery("val: \"GET\""))
.execute()
.actionGet();
Как уже говорилось, вы должны создать свой запрос, используя предоставленные QueryBuilders вместо строк. Это сохранит ваш код чистым и читаемым даже для сложных запросов.
getClient().prepareSearch(esIndex)
.setQuery(QueryBuilders.boolQuery()
.should(QueryBuilders.matchQuery("val", "GET"))
.execute()
.actionGet();
BoolQueryBuilder bool = boolQuery();
bool.must(QueryBuilders.matchAllQuery());
bool.filter(QueryBuilders.boolQuery().should(QueryBuilders.matchQuery("Val", "GET")));
AggregationBuilder agg = AggregationBuilders.terms("").field("");
SearchResponse reponse = getClient().prepareSearch().setIndices("indexName").setTypes("indexType")
.setQuery(bool).addAggregation(agg).execute().actionGet();
Вы должны использовать boolQuery() при создании QueryBuilder:
QueryBuilder qb = boolQuery()
.must(termQuery("content", "test1"))
.must(termQuery("content", "test4"))
.mustNot(termQuery("content", "test2"))
.should(termQuery("content", "test3"))
.filter(termQuery("content", "test5"));
Официальные документы: https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-compound-queries.html