场景
父子结点,常用于1:n 关系,有一个父子文档,对应多个子文档。
定义
定义一个my_id 字段
定义一个my_join_field字段,类型是join 类型,这里的relations 指的
相当于sql里的 a.aa=b.bb
aa里面的值是question
bb里面的值是answer
然后认为这两个相等,把父子联系起来
PUT my-index-000001
{
"mappings": {
"properties": {
"my_id": {
"type": "keyword"
},
"my_join_field": {
"type": "join",
"relations": {
"question": "answer"
}
}
}
}
}
insert 语句
插入父子结点
PUT my-index-000001/_doc/1?refresh
{
"my_id": "1",
"text": "This is a question",
"my_join_field": {
"name": "question"
}
}
插入子结点
PUT my-index-000001/_doc/3?routing=1&refresh
{
"my_id": "3",
"text": "This is an answer",
"my_join_field": {
"name": "answer",
"parent": "1"
}
}
PUT my-index-000001/_doc/4?routing=1&refresh
{
"my_id": "4",
"text": "This is another answer",
"my_join_field": {
"name": "answer",
"parent": "1"
}
}
从上面可以看出来,父子结点要分开插入,至于父文档和子文档,其实两个的字段实际上是通用的,共享同一个mapping
注意观察,通过parent 把具体的父ID和具体的子文档关联了起来。
"parent": "1"
查询
有两个重要的方法
has_child 用来写child的限定条件,返回父文档
GET /my-index-000001/_search
{
"query": {
"has_child": {
"type": "answer",
"query": {
"match": {
"my_id": "具体ID值"
}
}
}
}
}
has_parent 用来写parent的限定条件,返回子文档
GET /my-index-000001/_search
{
"query": {
"has_parent": {
"parent_type": "question",
"query": {
"match": {
"my_id": "具体ID值"
}
}
}
}
}