elasticsearch 从Elasticsearch返回包含子文档的父数据,elasticsearch,elasticsearch" /> elasticsearch 从Elasticsearch返回包含子文档的父数据,elasticsearch,elasticsearch" />

elasticsearch 从Elasticsearch返回包含子文档的父数据

elasticsearch 从Elasticsearch返回包含子文档的父数据,elasticsearch,elasticsearch,在Elasticsearch查询中搜索子文档是否可以返回父数据 我有两种文档类型,例如Book和Chapter,它们与父/子文档相关(不嵌套) 我想在子文档上运行搜索并返回子文档,以及父文档中的一些字段。我试图避免对父对象执行单独的查询 更新 我能找到的唯一可能的方法是使用has_child查询,然后使用一系列聚合来钻回子级并再次应用查询/筛选。然而,这似乎过于复杂和低效 GET index/_search { "size": 10, "query": { "has_child"

在Elasticsearch查询中搜索子文档是否可以返回父数据

我有两种文档类型,例如Book和Chapter,它们与父/子文档相关(不嵌套)

我想在子文档上运行搜索并返回子文档,以及父文档中的一些字段。我试图避免对父对象执行单独的查询

更新

我能找到的唯一可能的方法是使用
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,因为它没有发布和支持。