在mysql中,可以使用join
来实现表与表之间的数据连接,在es中如何实现这个问题?
相对于mysql来说,es有几个不同的地方
对于上面的几个问题,es的解决方案是**在一个索引下,借助父子关系,实现类似Mysql中多表关联的操作**
PUT myorder
{
"mappings": {
"_doc": {
"properties": {
"order_join": {
"type": "join",
"relations": {
"order": "suborder"
}
}
}
}
}
}
定义join关系为order_join
,其中order
是父文档,suborder
是子文档。
put myorder/_mapping/_doc
{
"properties": {
"orderId": {
"type": "keyword"
},
"shortTime": {
"type": "date"
},
"name": {
"type": "keyword"
},
"amount": {
"type": "double"
},
"desc": {
"type": "text"
}
}
}
PUT myorder/_doc/10001
{
"shortTime": "2019-01-05",
"orderId": "10001",
"name": "user2",
"amount": 123.09,
"desc": "其他收入",
"order_join": "order"
}
order_join
定义为order
类型
使用自定义ID用PUT方法
POST myorder/_doc?routing=1
{
"shortTime": "2019-01-05",
"orderId": "10001",
"name": "user2",
"amount": 12.09,
"desc": "收入",
"order_join": {
"name": "suborder",
"parent":"10001"
}
}
POST myorder/_doc?routing=1
{
"shortTime": "2019-01-05",
"orderId": "10002",
"name": "user2",
"amount": 122.09,
"desc": "收入",
"order_join": {
"name": "suborder",
"parent":"10001"
}
}
建立父子关系索引,
routing
参数是必须的,因为父子文档必须在同一个分片上
GET myorder/_search
{
"query": {
"has_child" : {
"type" : "suborder",
"query" : {
"match_all" : {
}
}
}
}
}
GET myorder/_search
{
"query": {
"has_parent" : {
"parent_type" : "order",
"query" : {
"match_all" : {
}
}
}
}
}
GET myorder/_search
{
"query": {
"parent_id": {
"type": "suborder",
"id": "10001"
}
},
"aggs": {
"parents12312": {
"terms": {
"field": "order_join#order"
},
"aggs": {
"sumAmount": {
"stats": {
"field": "amount"
}
}
}
}
}
}
GET myorder/_search
{
"size": 0,
"aggs": {
"parent": {
"children": {
"type": "suborder"
},
"aggs": {
"sumAmount": {
"stats": {
"field": "amount"
}
}
}
}
}
}
GET myorder/_search
{
"query": {
"has_child" : {
"type" : "suborder",
"query" : {
"match_all" : {
}
}
}
},
"aggs": {
"parent": {
"children": {
"type": "suborder"
},
"aggs": {
"fields": {
"terms": {
"field": "orderId"
},
"aggs": {
"sumAmount": {
"sum": {
"field": "amount"
}
},
"having": {
"bucket_selector": {
"buckets_path": {
"orderCount": "_count",
"sumAmount": "sumAmount"
},
"script": {
"source": "params.sumAmount >= 100 && params.orderCount >=0"
}
}
}
}
}
}
}
}
}
一对一的索引模型很难满足日常业务的数据处理,es也支持一对多的join
PUT myorder
{
"mappings": {
"_doc": {
"properties": {
"order_join": {
"type": "join",
"relations": {
"order": ["suborder1", "suborder2"],
"suborder2":"suborder3"
}
}
}
}
}
}
上面的索引的关联的关系如下:
order
/ \
suborder1 suborder2
\
suborder3
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有