两种方式:Nested object / Parent child
1.关系型数据库中实现关联关系
在说Elasticsearch实现关联关系之前,先看看关系型数据库是如何实现父子的关联关系的。假设一个商品的SPU下面包含了两个商品的SKU,SPU ID为1的数据包含了2个SKU,那么SPU箭头指向的蓝色框体的SKU就会定义对应的parent节点的ID。在实际查询的时候就可以将SPU和SKU通过SPU ID进行join操作,就可以查询关联表信息了。
2.Nested object
创建一个spu_test的索引mapping,所对应的类型为spu,对应属性spu_name为text类型。由于spu包含了多个sku因此设置一个skus属性,其类型设置为nested,表示是一个内嵌对象。在这个内嵌对象中再对其进行属性定义,这里定义了sku_name其类型为text。
# 7.x版本以下PUT /spu_test{"mappings": {"spu": {"properties": {"spu_name": {"type": "text"},"skus": {"type": "nested","properties": {"sku_name": {"type": "text"}}}}}}}# 7.x版本后不再支持指定索引类型,默认索引类型是_docPUT /spu_test{"mappings": {"properties": {"spu_name": {"type": "text"},"skus": {"type": "nested","properties": {"sku_name": {"type": "text"}}}}}}
3.Parent child
和nested object类似,parent child也通过类型定义来完成父子关系的关联。如下图,创建一个spu_index_parent_child的mapping,在mapping中定义一个join的属性,其类型也是join,通过relations表示父子关系的定义。
# 7.x版本以下PUT /spu_test2{"mappings": {"doc": {"properties": {"join": {"type": "join","relations":{"spu": "sku"}}}}}}# 7.x版本后不再支持指定索引类型,默认索引类型是_docPUT /spu_test2{"mappings": {"properties": {"join": {"type": "join","relations": {"spu": "sku"}}}}}
创建父文档
PUT /spu_test_parent_child/_doc/1{"name": "iPhone14","join": "spu"}
创建子文档
PUT /spu_test_parent_child/_doc/sku?routing=1{"goodsColor": "white","join": {"name": "sku","parent": 1}}
