Elasticsearch在hasParentQuery中命名查询不起作用?

时间:2017-01-02 16:31:16

标签: java elasticsearch

我做了一个测试来测试我在hasParentQuery中获得了正确的命名查询。但似乎它不起作用。

运行elasticsearch 2.4,我找不到任何关于它的信息。或者它可能是一个错误? https://www.elastic.co/guide/en/elasticsearch/reference/2.4/search-request-named-queries-and-filters.html

输出

parent
outerBool
// "innerBool" and "term" should also be here?

JSON搜索查询

{
  "query": {
    "bool": {
      "must": {
        "has_parent": {
          "query": {
            "bool": {
              "should": {
                "term": {
                  "value": {
                    "value": "1",
                    "_name": "term"
                  }
                }
              },
              "_name": "innerBool"
            }
          },
          "parent_type": "branch",
          "_name": "parent"
        }
      },
      "_name": "outerBool"
    }
  }
}

测试:

client.admin().indices().create(new CreateIndexRequest("my_index")).actionGet();

String employee =
    IOUtils.toString(this.getClass().getClassLoader().getResourceAsStream("employeeMapping.json"));
client.admin().indices().preparePutMapping("my_index")
    .setType("employee").setSource(employee).execute().actionGet();
String branch = IOUtils.toString(this.getClass().getClassLoader().getResourceAsStream("branchMapping.json"));
client.admin().indices().preparePutMapping("my_index").setType("branch").setSource(branch).execute()
    .actionGet();

String parentId = "1";
client.prepareIndex("my_index", "branch", parentId)
    .setSource(new HashMap<String, Object>() {{
        put("value", "1");
        put("value2", "2");
    }}).execute().actionGet();
client.prepareIndex("my_index", "employee", parentId)
    .setSource(new HashMap<String, Object>() {{
        put("id", "1");
    }}).setParent(parentId).execute().actionGet();

Thread.sleep(1000);

SearchRequestBuilder searchRequestBuilder = client.prepareSearch("my_index").setTypes("employee").setQuery(
    QueryBuilders.boolQuery().must(
        QueryBuilders.hasParentQuery("branch",
            QueryBuilders.boolQuery()
                .should(QueryBuilders.termQuery("value", "1").queryName("term")).queryName("innerBool")

        ).queryName("parent")
    ).queryName("outerBool")
);
SearchResponse searchResponse = searchRequestBuilder.execute().actionGet();

Arrays.stream(searchResponse.getHits().getHits()[0].getMatchedQueries()).forEach(q ->
    System.out.println(q)
);

branchMapping.json

{
  "properties": {}
}

employeeMapping.json

{
  "_parent": {
    "type": "branch"
  }
}

1 个答案:

答案 0 :(得分:0)

我必须将inner_hits添加到父查询中,以便响应中的innerHits元素添加,我可以从那里获取matchedQueries。

QueryBuilders.hasParentQuery("branch",
   QueryBuilders.boolQuery()
      .should(QueryBuilders.termQuery("value", "1").queryName("term")).queryName("innerBool"))
   .queryName("parent")
   .innerHit(new QueryInnerHitBuilder())