ElasticSearch是一个基于Lucene的开源搜索引擎,支持全文检索,提供restful接口。在ES中,提供了类似于MongoDB的面向文档存储服务,这种面向文档的存储非常灵活,但是文档与文档直接的关联却比较麻烦,MongoDB里面有DBref,ElasticSearch里面却没有这个,这篇文章就简单讲一讲ES的关联查询。

使用nested:

这种类型支持在一个文档中嵌入多个另外类型的文档。
假如说我们需要在一个type里面存储多个人的名字,并且需要把姓和名分开存,这个时候我们
可以这样去定义mapping:

{
"test" : {
"properties" : {
"users" : {
"type" : "nested",
"properties": {
"first" : {"type": "string" },
"last" : {"type": "string" }
}
}
}
}
}

首先把type定义成nested类型,然后在users下面嵌入mapping的属性。
对嵌入数据的查询可以使用“.”进行访问,具体内容可以参考官网链接

使用内嵌的类型的优势在于一次查询,本身的文档和内嵌的文档一起返回。唯一不方便的就是对内嵌数据进行插入或者删除操作的时候需要使用Update模块,Update对数据的操作都是通过脚本实现的,个人感觉使用起来不是很方便。为了解决这个问题,我们可以使用新方法,parent-child模块。

使用parent-child:

这个模块支持在插入数据的时候,可以指定一条数据为parent,通过这种方式将2条数据关联起来。
首先在定义mapping的时候就需要指定child文档需要关联哪个type的parent,例如:

{
"user" : {
"_parent": {
"type": "test"
},
"properties": {
"first" : {"type": "string" },
"last" : {"type": "string" }
}
}
}

user就是test的child
然后我们需要在插入child数据的时候指定他关联的是具体哪一条parent的id,假设我们在test里面有一条数据,id为test_id,那么我们想插入一条child数据关联到id为test_id的数据的时候,我们需要这样写:

curl -XPUT localhost:9200/wahaha/user/user_id?parent=test_id    -d '
{
"first":"wang",
"last":"ergou"
}'

这里我们插入了一条id为user_id的数据,并且和id为test_id的数据关联。
接下来我们可以通过child的属性去查找parent

{
"query": {
"has_child": {
"type": "user",
"query": {
"match":{
"last":"ergou"
}
}
}
}
}

这里我们使用has_child方法查找的和last等于二狗的user数据关联的test数据,在has_child方法中,我们显式指定了关联的type为user,然后对user进行了一次查询,找到last等于二狗的数据,然后返回这条数据的parent
我们还可以通过parent属性去查找child

{
"query": {
"has_parent": {
"type": "test",
"query": {
"match":{
"name":"ergou`s father"
}
}
}
}
}

这里我们使用的是has_parent方法,和has_child类似,我们先找到二狗他爹这条数据,然后再找到这条数据的child,返回结果。再提供一个官网链接
使用parent-child就比内嵌类型灵活很多,对数据的修改不需要使用Update。,可以根据parent查child,也可以根据child查parent,如果需要返回2种文档就需要使用聚合。

ElasticSearch关联查找的更多相关文章

  1. elasticsearch 关联查询

    父-子关系文档 父-子关系文档 在实质上类似于 nested model :允许将一个对象实体和另外一个对象实体关联起来. 而这两种类型的主要区别是:在 nested objects 文档中,所有对象 ...

  2. elasticsearch 关联单词查询以及Shingles

    Shingle Token Filter A token filter of type shingle that constructs shingles (token n-grams) from a ...

  3. EF LEFT JON 关联查找

    var query = (from a in context.OQC_INSPECTION_SAMPLE.Where(expression).Where(a => context.OQC_INS ...

  4. Elasticsearch究竟要设置多少分片数?

    0.引言 本文翻译自Elasticsearch20170918热乎的官方博客,原作者:Christian Dahlqvist. 在构建Elasticsearch集群的初期如果集群分片设置不合理,可能在 ...

  5. [moka同学笔记]Yii2中多表关联查询(join、joinwith) (摘录)

    表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer   (id  customer_name) 订单表Order          (id  order_name       cu ...

  6. Yii2.0中文开发向导——Yii2中多表关联查询(join、joinwith)(转)

    我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer   (id  customer_name) 订单表Order          (id  order_ ...

  7. Yii2.0中文开发向导——Yii2中多表关联查询(join、joinwith)

    我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer   (id  customer_name) 订单表Order          (id  order_ ...

  8. Yii多表关联

    表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer    (id  customer_name) 订单表Order           (id  order_name       ...

  9. Yii2中多表关联查询(hasOne、hasMany、join、joinwith)

    表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer   (id  customer_name) 订单表Order      (id  order_name  customer_id ...

随机推荐

  1. Redis 基础操作

    [Redis 基础操作] 1.ECHO message. Returns message. 2.PHING Returns PONG if no argument is provided, other ...

  2. testng的xml文件说明(TestNG DTD)

    testNG启发自JUnit和NUnit的一种测试框架,通过使用testNG使的测试更简单.,比如如下的一些特点: 1.通过注释来管理测试 2.多线程并发执行测试,且是安全的 3.支持数据驱动测试 4 ...

  3. 【bzoj1096】仓库建设 斜率优化dp

    AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=1096 [题解] 设输入的三个数组为a,b,c sumb维护b数组的前缀和,sumab维护a ...

  4. MicroRNA in Control of Gene Expression: An Overview of Nuclear Functions 微RNA控制基因表达:核功能概述

    MicroRNA in Control of Gene Expression:An Overview of Nuclear Functions微RNA控制基因表达:核功能概述 抽象:小的非编码RNA( ...

  5. struts,hibernate,spring配置时问题汇总及解决办法

    1.java.lang.NoClassDefFoundError: org/objectweb/asm/ClassVisitor 缺少asm-3.3.jar 2.java.lang.NoClassDe ...

  6. ubuntu系统中解决github下载速度慢问题

    如果你在使用github,出现访问和下载速度慢问题,可以通过修改host解决.记得不要踩坑哦!分四步: 第一步:查询速度快的IP地址 在http://tool.chinaz.com/dns中查询下面三 ...

  7. Scheduling the Delivery of Local Notifications

    [Scheduling the Delivery of Local Notifications] Apps can use local notifications to display alerts, ...

  8. QQ互联

    [移动应用接入概述] QQ互联开放平台为第三方移动应用提供了丰富的API.第三方移动应用接入QQ互联开放平台后,即可通过调用平台提供的API实现用户使用QQ账号登录移动应用功能,且可以获取到腾讯QQ用 ...

  9. mongo学习-TTL索引 过期数据

    在mongo中我们可以设置文档的过期时间,超过时间,文档会自动删除.(2.x版本中  固定结合也支持,但是到了3.x中 固定集合这个索引不好用) 用法: 1.创建一个db:db.createColle ...

  10. ceph故障:too many PGs per OSD

    原文:http://www.linuxidc.com/Linux/2017-04/142518.htm 背景 集群状态报错,如下: # ceph -s cluster 1d64ac80-21be-43 ...