我需要生成一个具有以下结构的查询字符串:
{
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
....
}
}
},
"aggregations": {
"facets": {
"terms": {
"field": "subject"
}
}
}
}
我正在使用以下客户端进行搜索:
Client client = new TransportClient(my_settings_object)
.addTransportAddress(new InetSocketTransportAddress("localhost", "9200"));
SearchResponse sr = client.prepareSearch("my_index")
.setTypes("my_doctype")
.setQuery(query) ; // this is above query string built manually
.execute().actionGet();
return sr;
我收到以下错误:
QueryParsingException[[my_idex] No query registered for [query]]
似乎这个错误在这篇SO帖子中解释了:
elasticsearch - No query registered for [query]]
基本上,我的客户端会自动插入顶级查询属性,使其看起来像:
{
query: {
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
....
}
}
},
"aggregations": {
"facets": {
"terms": {
"field": "subject"
}
}
}
}
}
如何阻止我的客户端自动插入顶级查询属性?
谢谢和问候。
答案 0 :(得分:1)
如何在Java代码中构建query
对象?
尝试使用QueryBuilders.filteredQuery(...)
进行准备:当您调用SearchRequestBuilder的相关setter时,结果将包含在query
属性中。
答案 1 :(得分:1)
使您的查询和聚合查询单个JSON对象。将查询更改为:
{
"filtered": {
"query": {
"match_all": {
}
},
"filter": {
....
}
}
}
更改聚合,使它们位于单独的JSON对象中:
{
"facets": {
"terms": {
"field": "subject"
}
}
}
在SearchRequestBuilder中设置查询和聚合:
SearchResponse sr = client.prepareSearch("my_index")
.setTypes("my_doctype")
.setQuery(query) ; // this is above query string built manually
.setAggregations(aggregations.getBytes());
.execute().actionGet();