我使用以下elasticsearch查询来获取详细信息,
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"bool": {
"should": [
{"match": {
"val": "GET"
}}]
}
}
}
}
}
工作正常并根据需要给出结果。
我想通过java执行相同的查询并获得相同的结果并尝试以下内容,
getClient().prepareSearch(esIndex)
.setQuery(QueryBuilders.queryStringQuery(QUERY)).execute().actionGet();
它不会返回数据并抛出一些查询格式错误的异常。
是否有可用的Java API可用于执行相同的查询?
注意:有可能在java api中创建boolquery和aggregation builder,并执行相同的操作。我很想找到一种直接通过elasticsearch java api
执行此查询的方法答案 0 :(得分:3)
如果您确实想使用查询字符串查询,则查询必须遵循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();
答案 1 :(得分:2)
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();
答案 2 :(得分:1)
在构造QueryBuilder时应该使用boolQuery():
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