标签:更新 数据库 保险 使用 处理 key dex 结合 ash
1、上问题请问在一张订单表里,用户购买的产品是一条数据,我现在想查既购买了 A 又买了 B 的用户,这种需求能做吗?
在表里存在一个用户购买了多种产品和一个产品被多个人购买的情况,每个用户购买的产品是一条单独的数据。
假如现在的表已经是我上边说的那种情况了,能写出符合我查询要求的DSL吗?
球友提问
注意,类似的问题是业务问题,如果要实际落地分析,需要进一步核实确认当前的数据建模。
本质一句话:数据的建模决定了数据的存储,数据的存储决定了数据的检索实现。
经反复讨论,敲定了当前的简化的数据建模如下:
PUT products
{
"mappings": {
"properties": {
"uid":{
"type":"keyword"
},
"tag_name":{
"type":"keyword"
}
}
}
}
POST products/_bulk
{"index":{"_id":1}}
{"tag_name":["阳光保险-2016"], "uid":"1111_2222"}
{"index":{"_id":2}}
{"tag_name":"太平洋保险-2020", "uid":"1111_2222"}
{"index":{"_id":3}}
{"tag_name":"平安保险-2019", "uid":"333333"}
两个字段给大家简单解读一下:
怎么做?
看到这里,大家可以想一下?暂停几秒,再往后看... ...
这时候,脑海里想一下,检索或者聚合能否实现类似需求?
注意:购买了 “阳光保险-2016” 和 “太平洋保险-2020” ,是与的关系。首先想到的是:bool 和 must 结合。
很快啊,答案写在了下面
POST products/_search
{
"query": {
"bool": {
"must": [
{
"term": {
"tag_name": "阳光保险-2016"
}
},
{
"term": {
"tag_name": "太平洋保险-2020"
}
}
]
}
}
}
但,放到 Kibana里面执行一下,发现怎么返回结果为空?
大意了吗?!再仔细审题.....
恍然大悟,本质错误原因在于:一对一的字段映射关系,怎么能得到两个或者多个都匹配的结果呢?
这才意识到哪里出了问题?!——不是数据检索,而是数据建模!
问题的本质再细化抽象:
这已经不是简单的 Mysql 中的一对一的数据关系,所谓一对一代表 —— 一个用户 id 对应一个产品名。
如下图所示:多个 1 对 1 表示不同的doc。
而是:一对多的数据关系。
为什么?多个一对一是不能解决:查找购买了“阳光保险-2016” 和 “太平洋保险-2020” 的用户的需求的?
那怎么实现呢?几乎没有更好的方法,除了:数据重新建模。
再建模的时候,要以上面的一对多的图示作为依据。
这时候,脑海里要浮现出 ES 支持哪些所谓“多表关联”操作?
至少应该想到:
POST products/_bulk
{"index":{"_id":1}}
{"tag_name":["阳光保险-2016", "太平洋保险-2020"], "uid":"1111_2222"}
{"index":{"_id":2}}
{"tag_name":"太平洋保险-2020", "uid":"1111_2222"}
{"index":{"_id":3}}
{"tag_name":"平安保险-2019", "uid":"333333"}
如此,一对一的数据建模变成了一对多的数据建模。
验证一把结果是否达到预期呢?
POST products/_search
{
"query": {
"bool": {
"must": [
{
"term": {
"tag_name": "阳光保险-2016"
}
},
{
"term": {
"tag_name": "太平洋保险-2020"
}
}
]
}
}
}
返回结果(仅贴出了 hits 部分):
"hits" : [
{
"_index" : "products",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.6161176,
"_source" : {
"tag_name" : [
"阳光保险-2016",
"太平洋保险-2020"
],
"uid" : "1111_2222"
}
}
]
很简单的就实现了需求。
注意:Object,nested 等也可以实现,要根据具体业务所需,不再展开讲。
为什么是再谈,是因为我们强调过:干货 | 论Elasticsearch数据建模的重要性。
尤其基础数据源来自关系型数据库(Mysql、Oracle 等)的业务数据,切记不要将数据同步到ES就完事大吉。
同步之前需要讨论:
数据建模的培养没有太好的速成方法,需要结合项目实践、反馈、再实践、再反馈总结。形成知识积累。
加微信:elastic6(仅有少量坑位了),和 BAT 大佬一起精进 Elastic 技术!
推荐阅读:
Elasticsearch Top 51 重中之重面试题及答案
Elasticsearch 搜索工程师笔试面试,请先看这 10 条建议!
干货 | BAT等一线大厂 Elasticsearch面试题解读
重磅 | 死磕 Elasticsearch 方法论认知清单(2020年国庆更新版)
能拿驾照就能通过 Elastic 认证考试!
更短时间更快习得更多干货!
中国 近 50%+ Elastic 认证工程师出自于此!
和全球 800+ Elastic 爱好者一起死磕 Elasticsearch!
标签:更新 数据库 保险 使用 处理 key dex 结合 ash
原文地址:https://blog.51cto.com/15050720/2562589