elasticsearch 从Elasticsearch返回包含子文档的父数据
在Elasticsearch查询中搜索子文档是否可以返回父数据 我有两种文档类型,例如Book和Chapter,它们与父/子文档相关(不嵌套) 我想在子文档上运行搜索并返回子文档,以及父文档中的一些字段。我试图避免对父对象执行单独的查询 更新 我能找到的唯一可能的方法是使用
elasticsearch 从Elasticsearch返回包含子文档的父数据,
elasticsearch,
elasticsearch,在Elasticsearch查询中搜索子文档是否可以返回父数据 我有两种文档类型,例如Book和Chapter,它们与父/子文档相关(不嵌套) 我想在子文档上运行搜索并返回子文档,以及父文档中的一些字段。我试图避免对父对象执行单独的查询 更新 我能找到的唯一可能的方法是使用has_child查询,然后使用一系列聚合来钻回子级并再次应用查询/筛选。然而,这似乎过于复杂和低效 GET index/_search { "size": 10, "query": { "has_child"
has_child
查询,然后使用一系列聚合来钻回子级并再次应用查询/筛选。然而,这似乎过于复杂和低效
GET index/_search
{
"size": 10,
"query": {
"has_child": {
"type": "chapter",
"query": {
"term": {
"field": "value"
}
}
}
},
"aggs": {
"name1": {
"terms": {
"size": 50,
"field": "id"
},
"aggs": {
"name2": {
"top_hits": {
"size": 50
}
},
"name3": {
"children": {
"type": "type2"
},
"aggs": {
"docFilter": {
"filter": {
"query": {
"match": {
"_all": "value"
}
}
},
"aggs": {
"docs": {
"top_hits": {
"size": 50
}
}
}
}
}
}
}
}
}
}
可以执行
has_child
查询,以返回具有热门项的父文档
聚合以返回子文档,但这有点麻烦
将在1.5.0中发布的内部点击
功能将满足您的需求
您可以从master构建源代码并进行试用。正如Dan Tuffery在他的评论中所说,目前,这可以通过内部点击来实现,在Java中,您可以通过下一段代码更轻松地理解它
SearchResponse searchResponse = this.transportClient.prepareSearch("your_index")
.setTypes("your_type")
.setQuery(QueryBuilders.filteredQuery(
null,
FilterBuilders.hasParentFilter(
"parent_type_name",
FilterBuilders.termFilter("foo", "foo"))
.innerHit(new QueryInnerHitBuilder()))
)
.execute().actionGet();
List<YourObject> list = new ArrayList<>();
for (SearchHit searchHit : searchHits.getHits()) {
YourObject yourObject = this.objectMapper.readValue(searchHit.getSourceAsString(), YourObject.class);
yourObject.setYourParentObject(this.objectMapper.readValue(searchHit.getInnerHits().get("parent_type_name").getAt(0).getSourceAsString(), YourParentObject.class));
list.add(yourObject);
}
SearchResponse SearchResponse=this.transportClient.prepareSearch(“您的索引”)
.setTypes(“您的类型”)
.setQuery(QueryBuilders.filteredQuery(
无效的
FilterBuilders.hasParentFilter(
“父项类型名称”,
FilterBuilders.termFilter(“foo”,“foo”))
.innerHit(新的QueryInnerHitBuilder())
)
.execute().actionGet();
列表=新的ArrayList();
for(SearchHit SearchHit:searchHits.getHits()){
YourObject YourObject=this.objectMapper.readValue(searchHit.getSourceAsString(),YourObject.class);
yourObject.setYourParentObject(this.objectMapper.readValue(searchHit.getInnerHits().get(“父类型\名称”).getAt(0.getSourceAsString(),YourParentObject.class));
添加(你的对象);
}
现在可以使用ElasticSearch完成此操作。只需在搜索查询中使用“has\u parent”:
'has_parent': {
'parent_type': 'book',
'query': {
'match_all': {}
},
'inner_hits': {}
}
结果将显示在响应的内部点击中。您需要更具体一些。为
嵌套查询返回的文档确实包含“根”文档中的字段。我已用更多信息更新了原始问题。我想知道您是否找到了此问题的答案。我在寻找完全相同的问题。这也是我的想法。我已经用我的“has_child”方法更新了这个问题。不幸的是,我不能使用1.5,因为它没有发布和支持。