两种方式: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版本后不再支持指定索引类型,默认索引类型是_doc
PUT /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版本后不再支持指定索引类型,默认索引类型是_doc
PUT /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
}
}