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 ...
随机推荐
- day32 Python与金融量化分析(二)
第一部分:金融与量化投资 股票: 股票是股份公司发给出资人的一种凭证,股票的持有者就是股份公司的股东. 股票的面值与市值 面值表示票面金额 市值表示市场价值 上市/IPO: 企业通过证券交易所公开向社 ...
- mysqldump 使用方法
1.仅导出数据: mysqldump -t -uroot -proot pgenius RES_COM_PFT_FCST>RES_COM_PFT_FCST.sql 2.有条的导出数据: mysq ...
- SpringInAction--Bean参数的自动注入
前面我已经学过了,将一个bean引用注入到另一个bean的属性或构造器参数中,这边指的是将一个对象与另一个对象进行关联. 我们学过的方法是在创建的时候根据new对象的时候,注入参数,如下: @Bean ...
- vue.js 源代码学习笔记 ----- 工具方法 perf
import { inBrowser } from './env' export let mark export let measure if (process.env.NODE_ENV !== 'p ...
- SpringMVC札集(04)——SpringMVC传递参数
自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View系列教程03–onL ...
- Modules(最小树形图)
题目链接: Modules 描述 蒜头有一块主板,为了提升其性能,可在主板上安置若干增强模块.蒜头有n个不同的增强模块,增强模块可以直接安置在主板上,也可以安置在已经直接或间接连接在主板上的其他增强模 ...
- Spring之基本关键策略
目的 为了简化Java开发. 策略 基于POJO(普通Java类)的轻量级和最小侵入性编程: 通过依赖注入(DI)和面向接口实现松耦合: 基于切面和惯例进行声明式编程: 通过切面和模板减少样板式代码. ...
- HDU1496 Equations 卡时间第二题
Consider equations having the following form: a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 a, b, c, d are integers ...
- 利用ajax完成项目图册上传删除【实际项目】
[项目页面效果] [前台jsp页面] jsp的js代码 <script type="text/javascript"> //上传项目图片 function upload ...
- linux自学(四)之开始centos学习,网络配置
上一篇:linux自学(三)之开启虚拟机 安装好镜像之后,重启之后需要登录,我这里直接是root账号直接登录的,注意:输入密码的时候不显示. 之后输入ifconfig最常用的命令来查看网卡信息,出现c ...