Elasticsearch返回父子数据关联查询案例
本文涉及到的技术点:
- inner_hits的使用,通过inner_hits来同时返回父表数据和子表数据
- 父子双向数据检索及结果绑定和遍历
1.准备工作
参考文档《 高性能elasticsearch ORM开发库使用介绍》导入和配置es客户端
2.定义带inner_hits的dsl检索语句
在dsl配置文件-esmapper/indexparentchild.xml中增加两个dsl检索语句:
hasChildSearchReturnParent2ndChildren 演示在按照雇员信息检索公司数据时,同时返回符合条件的公司下面的员工信息
hasParentSearchByCountryReturnParent2ndChildren 演示在按照公司信息检索雇员数据时,同时返回符合条件的雇员对应的公司信息
<!--以雇员姓名为条件检索公司信息并返回公司雇员信息--> <property name="hasChildSearchReturnParent2ndChildren"> <![CDATA[ { "query": { "has_child": { "type": "employee", "score_mode": "max", "query": { "match": { "name": #[name] ##雇员名称参数 } }, "inner_hits": {} ## 这是同时返回父子数据的关键所在 } } } ]]> </property> <!--根据公司所在的国家信息检索员工信息,同时返回员工所属的公司信息--> <property name="hasParentSearchByCountryReturnParent2ndChildren"> <![CDATA[ { "query": { "has_parent": { "type": "company", "query": { "match": { "country": #[country] ##国家代码参数 } }, "inner_hits": {} ## 这是同时返回父子数据的关键所在 } } } ]]> </property>
3.定义检索操作方法
在文件 ParentChildTest.java中增加以下方法
/** * 检索公司信息,并返回公司对应的雇员信息(符合检索条件的雇员信息) */ public void hasChildSearchReturnParent2ndChildren(){ ClientInterface clientUtil = ElasticSearchHelper.getConfigRestClientUtil("esmapper/indexparentchild.xml"); Map<String,Object> params = new HashMap<String,Object>(); params.put("name","Alice Smith"); try { ESInnerHitSerialThreadLocal.setESInnerTypeReferences(Employee.class);//指定inner查询结果对于雇员类型 ESDatas<Company> escompanys = clientUtil.searchList("company/company/_search","hasChildSearchReturnParent2ndChildren",params,Company.class); long totalSize = escompanys.getTotalSize(); List<Company> companyList = escompanys.getDatas();//获取符合条件的公司 //查看公司下面的雇员信息(符合检索条件的雇员信息) for (int i = 0; i < companyList.size(); i++) { Company company = companyList.get(i); List<Employee> employees = ResultUtil.getInnerHits(company.getInnerHits(), "employee"); System.out.println(employees.size()); } } finally{ ESInnerHitSerialThreadLocal.clean();//清空inner查询结果对于雇员类型 } } /** * 通过公司所在国家检索雇员信息,并返回雇员对应的公司信息 */ public void hasParentSearchByCountryReturnParent2ndChildren(){ ClientInterface clientUtil = ElasticSearchHelper.getConfigRestClientUtil("esmapper/indexparentchild.xml"); Map<String,Object> params = new HashMap<String,Object>(); params.put("country","UK"); try { ESInnerHitSerialThreadLocal.setESInnerTypeReferences(Company.class);//指定inner查询结果对于公司类型 ESDatas<Employee> escompanys = clientUtil.searchList("company/employee/_search","hasParentSearchByCountryReturnParent2ndChildren",params,Employee.class); List<Employee> employeeList = escompanys.getDatas();//获取符合条件的雇员数据 long totalSize = escompanys.getTotalSize(); //查看每个雇员对应的公司信息 for(int i = 0; i < employeeList.size(); i ++) { Employee employee = employeeList.get(i); List<Company> companies = ResultUtil.getInnerHits(employee.getInnerHits(), "company"); System.out.println(companies.size()); } } finally{ ESInnerHitSerialThreadLocal.clean();//清空inner查询结果对于公司类型 } }
说明:
1) 通过ESInnerHitSerialThreadLocal指定了inner_hits中需要返回的数据对象类型
ESInnerHitSerialThreadLocal.setESInnerTypeReferences(Employee.class);//指定inner查询结果对于雇员类型
ESInnerHitSerialThreadLocal.setESInnerTypeReferences(Company.class);//指定inner查询结果对于公司类型
使用后需要清除:
ESInnerHitSerialThreadLocal.clean();//清空inner查询结果对于雇员类型
2) employee.getInnerHits()和company.getInnerHits()方法都是从ESBaseData继承的方法,bboss会自动将inner_hits检索到的父子关联数据设置到ESBaseData对象中,可以通过getInnerHits()方法获取到对应的数据;
3) ResultUtil.getInnerHits工具方法用于获取父/子关联检索对应的子/父的结果,方法的第二个参数对应inner_hits检索的类型和名称:
List<Employee> employees = ResultUtil.getInnerHits(company.getInnerHits(), "employee"); List<Company> companies = ResultUtil.getInnerHits(employee.getInnerHits(), "company");
4.执行测试方法
通过junit,执行新的测试方法
@Test public void testFromJson(){ createIndice(); importFromJsonData(); hasChildSearchByBirthday(); this.hasChildSearchByName(); this.hasChildSearchByMinChild(); this.hasParentSearchByCountry(); this.hasChildSearchReturnParent2ndChildren();//本文对应的方法 this.hasParentSearchByCountryReturnParent2ndChildren();//本文对应的方法 }
5.参考文档
https://www.elastic.co/guide/en/elasticsearch/reference/5.6/search-request-inner-hits.html#nested-inner-hits
6.开发交流
elasticsearch技术交流群:166471282
elasticsearch微信公众号:bbossgroups

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
使用OSS中的数据作为机器学习的训练样本
使用OSS中的数据作为机器学习的训练样本 背景 对象存储服务OSS 阿里云对象存储服务(Object Storage Service,以下简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。 云机器学习平台PAI 阿里云机器学习PAI(Platform of Artificial Intelligence,以下简称PAI)是一款一站式的机器学习平台,包含大量封装的算法组件和可视化工具,用户上手容易。 业务场景 本文通过OSS与PAI的结合,为一家传统的文具零售店提供决策支持。本文涉及的具体业务场景(场景与数据均为虚拟)如下: 一家传统的线下文具零售店,希望通过数据挖掘寻找强相关的文具品类,帮助合理调整文具店的货架布局。但由于收银设备陈旧,是一台使用XP系统的POS收银机,可用的销售数据仅有一份从POS收银机导出的订单记录(csv格式)。本文介绍如何将此csv文件导入OSS,并连通OSS与PAI,实现商品的关联推荐。 步骤 步骤一:数据导入OSS 新建一个名为“oss-pai-sample”的Bucket。 记录其endpoint为 oss-cn-shanghai.al...
- 下一篇
开源大数据周刊-第85期
资讯 美国公布长达35页的《2016-2045年新兴科技趋势报告》 前段时间美国公布的一份长达35页的《2016-2045年新兴科技趋势报告》。该报告是在美国过去五年内由政府机构、咨询机构、智囊团、科研机构等发表的32份科技趋势相关研究调查报告的基础上提炼形成的。 通过对近700项科技趋势的综合比对分析,最终明确了20项最值得关注的科技发展趋势。 HBase 2.0版本正式发布 Apache HBase PMC主席Michael Stack在Mail List中宣布了HBase 2.0版本已正式Release的消息,该版本可以说是迄今为止最大的一个版本。一起来看看HBase 2.0的一些新特性以及与HBase 1.0的兼容性问题等。 单机每秒最多可处理10亿条数据!eBay开源数据处理框架Accelerator 近日,eBay 宣布正式开源 A
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Linux系统CentOS6、CentOS7手动修改IP地址
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS关闭SELinux安全模块
- 2048小游戏-低调大师作品
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Docker快速安装Oracle11G,搭建oracle11g学习环境