elasticSearch创建父子文档

父子文档,适合子文档频繁更新的情况。

比如一个商家对应多个商品。而商家可能有几千个,每个商家又有几千个商品。

这种情况下,嵌套类型是不可取的,只能使用父子文档,它相当于 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,注意父文档的分片、和子文档的分片必须是同一个分片。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注