两种方式:Nested object / Parent child

1.关系型数据库中实现关联关系

在说Elasticsearch实现关联关系之前,先看看关系型数据库是如何实现父子的关联关系的。假设一个商品的SPU下面包含了两个商品的SKU,SPU ID为1的数据包含了2个SKU,那么SPU箭头指向的蓝色框体的SKU就会定义对应的parent节点的ID。在实际查询的时候就可以将SPU和SKU通过SPU ID进行join操作,就可以查询关联表信息了。
08_Elasticsearch数据建模方式 - 图1

2.Nested object

创建一个spu_test的索引mapping,所对应的类型为spu,对应属性spu_name为text类型。由于spu包含了多个sku因此设置一个skus属性,其类型设置为nested,表示是一个内嵌对象。在这个内嵌对象中再对其进行属性定义,这里定义了sku_name其类型为text。

  1. # 7.x版本以下
  2. PUT /spu_test
  3. {
  4. "mappings": {
  5. "spu": {
  6. "properties": {
  7. "spu_name": {
  8. "type": "text"
  9. },
  10. "skus": {
  11. "type": "nested",
  12. "properties": {
  13. "sku_name": {
  14. "type": "text"
  15. }
  16. }
  17. }
  18. }
  19. }
  20. }
  21. }
  22. # 7.x版本后不再支持指定索引类型,默认索引类型是_doc
  23. PUT /spu_test
  24. {
  25. "mappings": {
  26. "properties": {
  27. "spu_name": {
  28. "type": "text"
  29. },
  30. "skus": {
  31. "type": "nested",
  32. "properties": {
  33. "sku_name": {
  34. "type": "text"
  35. }
  36. }
  37. }
  38. }
  39. }
  40. }

3.Parent child

和nested object类似,parent child也通过类型定义来完成父子关系的关联。如下图,创建一个spu_index_parent_child的mapping,在mapping中定义一个join的属性,其类型也是join,通过relations表示父子关系的定义。

  1. # 7.x版本以下
  2. PUT /spu_test2
  3. {
  4. "mappings": {
  5. "doc": {
  6. "properties": {
  7. "join": {
  8. "type": "join",
  9. "relations":{
  10. "spu": "sku"
  11. }
  12. }
  13. }
  14. }
  15. }
  16. }
  17. # 7.x版本后不再支持指定索引类型,默认索引类型是_doc
  18. PUT /spu_test2
  19. {
  20. "mappings": {
  21. "properties": {
  22. "join": {
  23. "type": "join",
  24. "relations": {
  25. "spu": "sku"
  26. }
  27. }
  28. }
  29. }
  30. }

创建父文档

  1. PUT /spu_test_parent_child/_doc/1
  2. {
  3. "name": "iPhone14",
  4. "join": "spu"
  5. }

创建子文档

  1. PUT /spu_test_parent_child/_doc/sku?routing=1
  2. {
  3. "goodsColor": "white",
  4. "join": {
  5. "name": "sku",
  6. "parent": 1
  7. }
  8. }