Elasticsearch:如何防止我的客户端自动插入顶级查询属性

时间:2015-03-13 08:19:48

标签: elasticsearch

我需要生成一个具有以下结构的查询字符串:

{
  "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"
          }
        }
      }
    }
}

如何阻止我的客户端自动插入顶级查询属性?

谢谢和问候。

2 个答案:

答案 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();