假设有一个简单的博客索引,其中包含两种类型:博客和评论。一个博客可以有多个评论。索引是这样创建的
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"
}
}
}'
结果只包含第一条评论。
这是因为第二个评论位于第二个索引中,该索引本身没有父博客文档。因此,它不了解博客的作者。
所以,我的问题是在使用翻转时如何处理父子关系?
在这种情况下,这种关系是否可能?
答案 0 :(得分:0)
构成父子关系一部分的所有文档都需要存在于相同的索引中,更加珍贵的碎片。因此,如果使用翻转,则不可能有父子关系,因为它会创建新的索引。
上述问题的一个解决方案可能是通过在blog_author
类型中添加归档blog_id
和comment
来对数据进行非规范化。在这种情况下的映射将如下所示(注意已删除父子关系):
"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"
}
}
}'