Elasticsearch中父子文档的关联:Join类型实现层级关系
在Elasticsearch中,处理具有层级关系的文档(如商品与评论、文章与回复)时,Join数据类型提供了一种高效的父子关系建模方式。通过Join类型,可以在同一索引中建立文档间的关联,同时保持查询性能。
Join数据类型的基本原理
Join类型是一种特殊的字段类型,允许在同一个索引中创建父子文档关系。父文档和子文档存储在同一个分片上,确保查询效率。其核心原理是通过以下两个元字段建立关联:
name:定义关系名称(如"question"和"answer")。parent:子文档中指定父文档的ID。
示例映射定义:
PUT /forum
{
"mappings": {
"properties": {
"post_id": { "type": "keyword" },
"user": { "type": "keyword" },
"content": { "type": "text" },
"post_relation": {
"type": "join",
"relations": {
"question": "answer"
}
}
}
}
}
父子文档的写入操作
父文档写入时需要声明关系类型。以下是插入问题(父文档)的示例:
PUT /forum/_doc/1
{
"post_id": "1",
"user": "user_a",
"content": "如何优化Elasticsearch查询性能?",
"post_relation": {
"name": "question"
}
}
子文档写入时必须指定父文档ID和路由值(确保与父文档同分片):
PUT /forum/_doc/2?routing=1
{
"post_id": "2",
"user": "user_b",
"content": "可以使用过滤器缓存和分片查询优化",
"post_relation": {
"name": "answer",
1364

被折叠的 条评论
为什么被折叠?



