父子文档,适合子文档频繁更新的情况。
比如一个商家对应多个商品。而商家可能有几千个,每个商家又有几千个商品。
这种情况下,嵌套类型是不可取的,只能使用父子文档,它相当于 sql 中的 join。
mappings 的 字段
'tables_join'=>[ // 维护父子文档字段
'type'=>'join',
'relations'=>[
"store"=>"product", // 商家、商品 ---- 如果是一父多子,后者改为数组即可,如 "store"=>["product","comment"]
]
]
在 mappings 中,添加一个字段(名称随意,这里用 tables_join),用于维护父子关系。
上面的 store 就是父文档,而 product 就是子文档。
插入父文档:
"tables_join" : "store"
只需要指定一个属性即可,也就是把 tables_join 指定为前面指定的父文档。
插入子文档:
POST /index_name/_doc/shop_product_1305?routing=1 //必须要带 rounting,且和父文档的routing一致
{
"other" : "value", // 其他字段
"tables_join" : { // 要添加的字段
"name" : "product",
"parent" : "shop_store_111"
}
}
首先 :shop_product_1305 是当前商品的 id,也就是指定了商品 id,而父文档的 id 是 shop_store_111.
另外,tables_join 还有一个字段,就是 name ,这里的 name 就是前面指定的子文档的名称。
最后,有个坑,就是添加子文档的请求必须带 routing,这个 routing 是分片标识,如果从未指定或修改则默认情况下是 1,注意父文档的分片、和子文档的分片必须是同一个分片。