2017-01-02 72 views
0

我做了一个测试,以测试我在hasParentQuery中获得了正确的命名查询。但它似乎不起作用。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" 
    } 
} 

回答

0

我不得不inner_hits添加到父查询,以便为加入响应innerHits元素,我能得到matchedQueries从那里。

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