Elasticsearch:翻转后的父子关系

时间:2017-05-11 07:49:40

标签: elasticsearch parent-child rollover elasticsearch-5

假设有一个简单的博客索引,其中包含两种类型:博客和评论。一个博客可以有多个评论。索引是这样创建的

curl -X PUT \
  'http://localhost:9200/%3Cblog-%7Bnow%2Fd%7D-000001%3E?pretty=' \
  -H 'content-type: application/json' \
  -d '{
    "mappings": {
        "comment": {
            "_parent": { "type": "blog" },
            "properties": { 
                "name": { "type": "keyword" },
                "comment": { "type": "text" }
            }
        },
        "blog": {
            "properties": {
                "author": { "type": "keyword" },
                "subject": { "type": "text" },
                "content": { "type": "text" }
            }
        }
    }
}'

索引%3Cblog-%7Bnow%2Fd%7D-000001%3E等于<blog-{now/d}-000001>(有关日期数学的详情,请参阅here)。 我们将添加“博客活跃”#39;此索引的别名。该别名将用于存储数据。

curl -X POST 'http://localhost:9200/_aliases?pretty=' \
  -H 'content-type: application/json' \
  -d '{ "actions" : [ { "add" : { "index" : "blog-*", "alias" : "blog-active" } } ] }'

现在,如果我们执行以下操作:

1.使用blog-active别名

添加博客
curl -X POST http://localhost:9200/blog-active/blog/1 \
  -H 'content-type: application/json' \
  -d '{
      "author": "author1",
      "subject": "subject1",
      "content": "content1"
  }'

2.在博客上添加评论

curl -X POST \
  'http://localhost:9200/blog-active/comment/1?parent=1' \
  -H 'content-type: application/json' \
  -d '{
  "name": "commenter1",
  "comment": "new comment1"
}'

3.使用max_docs = 2进行翻转

curl -X POST \
  http://localhost:9200/blog-active/_rollover \
  -H 'content-type: application/json' \
  -d '{
  "conditions": {
    "max_docs": 2
  },
  "mappings": {
    "comment": {
      "_parent": { "type": "blog" },
      "properties": {
        "name": { "type": "keyword" },
        "comment": { "type": "text" }
      }
    },
    "blog": {
      "properties": {
        "author": { "type": "keyword" },
        "subject": { "type": "text" },
        "content": { "type": "text" }
      }
    }
  }
}'

4.并在博客上添加另一条评论

curl -X POST \
  'http://localhost:9200/blog-active/comment/1?parent=1' \
  -H 'content-type: application/json' \
  -d '{
  "name": "commenter2",
  "comment": "new comment2"
}'

现在,如果我们在所有博客索引中搜索关于&#39; author1&#39;的所有评论。带有(blog-%2A的博客是blog-*

curl -X POST \
  http://localhost:9200/blog-%2A/comment/_search \
  -H 'content-type: application/json' \
  -d '{
  "query": {
      "has_parent" : {
        "query" : {
          "match" : { "author" : { "query" : "author1" } }
        },
        "parent_type" : "blog"
      }
  }
}'

结果只包含第一条评论。

这是因为第二个评论位于第二个索引中,该索引本身没有父博客文档。因此,它不了解博客的作者。

blog indices

所以,我的问题是在使用翻转时如何处理父子关系?

在这种情况下,这种关系是否可能?

类似的问题:ElasticSearch parent/child on different indexes

1 个答案:

答案 0 :(得分:0)

构成父子关系一部分的所有文档都需要存在于相同的索引中,更加珍贵的碎片。因此,如果使用翻转,则不可能有父子关系,因为它会创建新的索引。

上述问题的一个解决方案可能是通过在blog_author类型中添加归档blog_idcomment来对数据进行非规范化。在这种情况下的映射将如下所示(注意已删除父子关系):

"mappings": {
  "comment": {
    "properties": {
      "blog_id": { "type": "keyword" },
      "blog_author": { "type": "keyword" },
      "name": { "type": "keyword" },
      "comment": { "type": "text" }
    }
  },
  "blog": {
    "properties": {
      "author": { "type": "keyword" },
      "subject": { "type": "text" },
      "content": { "type": "text" }
    }
  }
}

以及博客作者提取评论的查询是:

curl -X POST \
  http://localhost:9200/blog-%2A/comment/_search \
  -H 'cache-control: no-cache' \
  -H 'content-type: application/json' \
  -d '{
  "query": {
    "match": {
        "blog_author": "user1"
    }
  }
}'