elasticsearch 6.x 处理一对多关系使用场景
思考:一个用户有多篇博客,如何查询博客作者姓名中带“旺”字、博客标题中带“运”的10篇博客列表
elasticsearch关联模型;
一: 应用层做联接
2个索引
博客作者、博客发布
先从博客作者中查询出符合姓名中带“旺”字的作者ID,
然后根据这些ID、博客标题中带“运”字这两个条件查询出来博客列表
优点: 数据很规范清晰,作者一个索引,博客一个索引
缺点: 如果查询出来的作者ID很多的情况造成效率很低(如果有10万作者的话,每一次分页都需要先查作者,再拿作者ID为条件)
二:非规范化的数据
同一个索引中,博客作者和博客发布表整合成一个文档
冗余、冗余、冗余
优点:不需要做联接
缺点:由于作者博客为一对多关系,每次修改了作者姓名,都需要更新所有的索引文档数据,每次都需要批量改
三:嵌套对象
博客作者和博客发布存在于一个文档(nested)
索引映射中,所有的博客作为数组嵌套的类型存在
优点:不需联接
缺点:只能返回符合条件的整个文档,不能部分返回嵌套文档中的数据(nested查询职能返回最顶层的文档)
四:父-子关系文档
博客作者和博客发布存在于一个文档(join)
映射时将其中一个字段作为连接字段,供作关联关系
优点:能返回想要的数据
缺点:性能差一点
有了这样的粗略认知之后,实现开始提到的使用场景,选择第四种方案{父-子关系文档}, 并在做了一个简单类似的实验
// 1、创建索引及映射关系
put bnb_home {
"mappings": {
"home_search": {
"properties": {
"shop_room": {
"type": "join",
"relations": {
"shop": "room"
}
}
}
}
}
}
// 2、添加父文档(酒店信息)
PUT bnb_home/home_search/1?refresh {
"data": {"shopId":1, "shopName": "我是客栈锅手", "description": "我是一条测试数据"},
"shop_room": {
"name": "shop"
}
}
// 3、添加子文档(酒店房间信息)***划重点:URL中的routing必须是parent ID 的值
***
PUT bnb_home/home_search/2?routing=1&refresh {
"data": {"shopId":1, "roomId":1, "roomName": "我是一条小虫子", "description": "可爱清新风格"},
"shop_room": {
"name": "room",
"parent": "1"
}
}
// 4、再添加子文档(酒店房间信息)
PUT bnb_home/home_search/3?routing=1&refresh {
"data": {"shopId":1, "roomId":2, "roomName": "我是第二间房子", "description": "第二件仿佛回到开始"},
"shop_room": {
"name": "room",
"parent": "1"
}
}
// 5、查询酒店(查询店铺名称中带”你好“,房间名称带有“小虫”的{店铺})
POST bnb_home/_search {
"query": {
"bool":{
"must":[
{"match":{"data.shopName":"客栈"}},
{
"has_child" : {
"type" : "room",
"query" : {
"bool":{
"must":[
{"match":{"data.roomName":"小虫子"}}
]
}
}
}
}
]
}
}
}
// 6、查询酒店房间(查询店铺名称中带”你好“,房间名称带有“小虫”的{房间})
POST bnb_home/_search {
"query": {
"bool":{
"must":[
{"match":{"data.roomName":"小虫"}},
{
"has_parent" : {
"parent_type" : "shop",
"query" : {
"bool":{
"must":[
{"match":{"data.shopName":"客栈"}}
]
}
}
}
}
]
}
}
}
elasticsearch 6.x 处理一对多关系使用场景的更多相关文章
- 10.Configure One-to-Many(配置一对多关系)【Code-First系列】
现在,我们将学习怎么配置一对多的关系. Visit Entity Relationship section to understand how EF manages one-to-one, one-t ...
- Mybatis框架中实现双向一对多关系映射
学习过Hibernate框架的伙伴们很容易就能简单的配置各种映射关系(Hibernate框架的映射关系在我的blogs中也有详细的讲解),但是在Mybatis框架中我们又如何去实现 一对多的关系映射呢 ...
- [NHibernate]一对多关系(级联删除,级联添加)
目录 写在前面 文档与系列文章 一对多关系 一个例子 级联删除 级联保存 总结 写在前面 在前面的文章中,我们只使用了一个Customer类进行举例,而在客户.订单.产品中它们的关系,咱们并没有涉及, ...
- [NHibernate]一对多关系(关联查询)
目录 写在前面 文档与系列文章 一对多查询 总结 写在前面 上篇文章介绍了nhibernate的一对多关系如何配置,以及级联删除,级联添加数据的内容.这篇文章我们将学习nhibernate中的一对多关 ...
- [Fluent NHibernate]一对多关系处理
目录 写在前面 系列文章 一对多关系 总结 写在前面 上篇文章简单介绍了,Fluent Nhibernate使用代码的方式生成Nhibernate的配置文件,以及如何生成持久化类的映射文件.通过上篇的 ...
- hibernate中一对多关系中的inverse,cascade属性
举例说明: 一对多关系的两张表:boy.girl(一个男孩可以多个女朋友) boy表结构 Field Type ------ ----------- name varcha ...
- 【Java EE 学习 45】【Hibernate学习第二天】【对象的三种状态】【一对多关系的操作】
一.对象的三种状态. 1.对象有三种状态:持久化状态.临时状态.脱管状态(游离状态) 2.Session的特定方法能使得一个对象从一个状态转换到另外一个状态. 3.三种状态的说明 (1)临时状态:临时 ...
- hibernate学习(5)——一对多关系表达
一对多实现 1. 实现类 package com.alice.hibernate02.vo; import java.util.HashSet; import java.util.Set; publi ...
- linq 实现group by 不使用group关键字 等同lambad表达式中的group join 查询一对多关系
return from orderInfo in orderEntity.x_s_orderInfo join oState in orderEntity.x_s_oStatuInfo on orde ...
随机推荐
- Srping整合EhCache
引入的Jar包如下:
- 几款必备LINUX的命令行神器
Dstat & sar iostat, vmstat, ifstat 三合一的工具,用来查看系统性能(我在<性能调优攻略>中提到过那三个xxstat工具). 官方网站:http:/ ...
- Highcharts 标示区曲线图;Highcharts 对数图表;Highcharts 时间间隔图表
Highcharts 标示区曲线图 配置 使用 yAxis.plotBands 属性来配置标示区.区间范围使用 'from' 和 'to' 属性.颜色设置使用 'color' 属性.标签样式使用 'l ...
- 我要复习python啦(一)
一.变量 那些曾经怎么也看不懂的东西,突然有一天就懂了.这就是复习的力量吗? 1 变量的赋值 a = 10 做了上面的图所描述的事情 1)开辟一块内存,创建一个值为10的整数 2)创建一个a的标记 3 ...
- TCP的time_wait、close_wait状态
转载:http://huoding.com/2013/12/31/316 http://blog.csdn.net/lxnkobe/article/details/7525317 http://k ...
- 前端开发必备 - Emmet
介绍 Emmet (前身为 Zen Coding) 是一个能大幅度提高前端开发效率的一个工具. 基本上,大多数的文本编辑器都会允许你存储和重用一些代码块,我们称之为"片段".虽然片 ...
- SCRF的简介及防护手段
CSRF全拼为Cross Site Request Forgery,译为跨站请求伪造. CSRF指攻击者盗用了你的身份,以你的名义发送恶意请求. 包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购 ...
- 2017-2018-2 20165202 实验四《Android程序设计》实验报告
一.实验报告封面 二.实验内容 1.基于Android Studio开发简单的Android应用并部署测试; 2.了解Android.组件.布局管理器的使用: 3.掌握Android中事件处理机制. ...
- L161
The robot arm made for gentle undersea explorationA soft robotic arm which will allow underwater sea ...
- New Concept English there (7)
27w/m Has it ever happened to you? Have you ever put your trousers in the washing machine and then r ...