思考:一个用户有多篇博客,如何查询博客作者姓名中带“旺”字、博客标题中带“运”的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 处理一对多关系使用场景的更多相关文章

  1. 10.Configure One-to-Many(配置一对多关系)【Code-First系列】

    现在,我们将学习怎么配置一对多的关系. Visit Entity Relationship section to understand how EF manages one-to-one, one-t ...

  2. Mybatis框架中实现双向一对多关系映射

    学习过Hibernate框架的伙伴们很容易就能简单的配置各种映射关系(Hibernate框架的映射关系在我的blogs中也有详细的讲解),但是在Mybatis框架中我们又如何去实现 一对多的关系映射呢 ...

  3. [NHibernate]一对多关系(级联删除,级联添加)

    目录 写在前面 文档与系列文章 一对多关系 一个例子 级联删除 级联保存 总结 写在前面 在前面的文章中,我们只使用了一个Customer类进行举例,而在客户.订单.产品中它们的关系,咱们并没有涉及, ...

  4. [NHibernate]一对多关系(关联查询)

    目录 写在前面 文档与系列文章 一对多查询 总结 写在前面 上篇文章介绍了nhibernate的一对多关系如何配置,以及级联删除,级联添加数据的内容.这篇文章我们将学习nhibernate中的一对多关 ...

  5. [Fluent NHibernate]一对多关系处理

    目录 写在前面 系列文章 一对多关系 总结 写在前面 上篇文章简单介绍了,Fluent Nhibernate使用代码的方式生成Nhibernate的配置文件,以及如何生成持久化类的映射文件.通过上篇的 ...

  6. hibernate中一对多关系中的inverse,cascade属性

    举例说明: 一对多关系的两张表:boy.girl(一个男孩可以多个女朋友) boy表结构 Field   Type        ------  -----------  name    varcha ...

  7. 【Java EE 学习 45】【Hibernate学习第二天】【对象的三种状态】【一对多关系的操作】

    一.对象的三种状态. 1.对象有三种状态:持久化状态.临时状态.脱管状态(游离状态) 2.Session的特定方法能使得一个对象从一个状态转换到另外一个状态. 3.三种状态的说明 (1)临时状态:临时 ...

  8. hibernate学习(5)——一对多关系表达

    一对多实现 1. 实现类 package com.alice.hibernate02.vo; import java.util.HashSet; import java.util.Set; publi ...

  9. linq 实现group by 不使用group关键字 等同lambad表达式中的group join 查询一对多关系

    return from orderInfo in orderEntity.x_s_orderInfo join oState in orderEntity.x_s_oStatuInfo on orde ...

随机推荐

  1. 基于vue-cli,测试非父子传值时,碰到 keep-alive的神奇

    非父子传值测试 一直都很好奇非父子传值到底如何,结果入坑许久才爬出来,才知道在脚手架里测试就是坑. 问题: 测试非父子传值时,由于组件之间是通过路由进行跳转,值传过去又被刷掉 思路: 因为路由跳转,相 ...

  2. h5开发中,利用微信或者QQ登陆以后获取用户头像在canvas画布显示问题

    在实际开发上先的h5页面产品中,总会遇到各种坑,好多坑都是安卓和iPhone端兼容的问题(用电脑谷歌浏览器输入  chrome://inspect/#devices可以用手机USB调试,打开) eg: ...

  3. CF 187C Weak Memory 优先队列 难度:2

    http://codeforces.com/problemset/problem/187/C 这道题可以用二分+dfs检测,或者优先队列解 此处用了优先队列解法 从起点出发,维护一个优先队列,内容是p ...

  4. CF 913 A

    题解: 首先判断n是否大于30 大于30输出m 否则输出m%2^n 代码: #include<bits/stdc++.h> using namespace std; int n,m; in ...

  5. HDU 1198 Farm Irrigation(并查集+位运算)

    Farm Irrigation Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Tot ...

  6. Qt出现QObject::connect: Cannot queue arguments of type '******'的解决方法

    一般出现这种情况都是自定义的类型进行型号槽连接的时候出现的,使用 假设自定义的类型是MyClass 使用qRegisterMetaType<MyClass>("MyClass&q ...

  7. compass框架的sprite雪碧图的用法简要

    ---恢复内容开始--- **简介** CSS SPRITE 即 CSS雪碧,即是将诸多图片合成一张图片,然后使用CSS 的background和background-position属性渲染. 这样 ...

  8. 2018-2019-2 网络对抗技术 20165202 Exp6 信息搜集与漏洞扫描

    博客目录 一.实践目标 二.实践内容 各种搜索技巧的应用 DNS IP注册信息的查询 基本的扫描技术:主机发现.端口扫描.OS及服务版本探测.具体服务的查点 漏洞扫描:会扫,会看报告,会查漏洞说明,会 ...

  9. MDN搜索结果自动跳转中文地址

    MDN社区(即Mozilla开发者社区)具有很多高质量中英文文档.它是我开发时遇到概念模糊的地方经常访问的网站.因为默认搜索一些代码,优先显示的都是英文.但是恰恰这些显示的英文文档是有中文的.每次都是 ...

  10. gdi+ 中发生一般性错误 wpf解决方法

    错误背景:原来在winform程序中写了一个窗口,在wpf应用程序中调用显示了这个窗口,有个头像功能,加载本地的一个图片文件,加载前进行了各种逻辑判断,效果如下: 而加载的关键代码如下面: pictu ...