获取所有在elasticsearch中有child和parent_id的子项

时间:2016-11-27 15:24:42

标签: elasticsearch

我想获得所有“帖子”,其中包含ID为25的父“博客”,以及只有至少有一个孩子“评论”的“帖子”

我是elasticsearch的新手。使用版本5.

到目前为止,我知道我可以使用parent_idhas_childhas_parent

不确定如何合并这些查询...

到目前为止,我有:

GET /blog/post/_search
{
    "query": {
        "parent_id" : {
            "type" : "post",
            "id" : "25"
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您可以使用bool query组合查询 因此,假设您已创建类似于此示例的映射和数据:

PUT /blog 
{
  "mappings": {
    "blog": {},
    "post": {
      "_parent": {
        "type": "blog" 
      }
    },
    "comment": {
      "_parent": {
        "type": "post" 
      }
    }
  }
}

POST /blog/blog/_bulk
{ "index": { "_id": "21" }}
{ "name": "blog 11"}
{ "index": { "_id": "25" }}
{ "name": "blog 25" }
{ "index": { "_id": "22" }}
{ "name": "blog 24"}

POST /blog/post/_bulk
{ "index": { "_id": "1", "parent": "21" }}
{ "name": "post of blog 21 (with comments)"}
{ "index": { "_id": "2", "parent": "25" }}
{ "name": "post of blog 25 (with comments)"}
{ "index": { "_id": "3", "parent": "25" }}
{ "name": "post of blog 25 (without comments)"}

POST /blog/comment/_bulk
{ "index": { "_id": "10", "parent": "1", "routing": "21"}}
{ "name": "comment for post 1"}
{ "index": { "_id": "11", "parent": "2", "routing": "25" }}
{ "name": "comment for post 2"}

您的查询是:

GET blog/post/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "parent_id": {
            "type": "post",
            "id": "25"
          }
        },
        {
          "has_child": {
            "type": "comment",
            "query": {
              "match_all": {

              }
            }
          }
        }
      ]
    }
  }
}

也许将您的评论作为nested类型存储在帖子中会更合适 您可以详细了解nestedparent/child关系here之间的区别。