在一般的关系型数据库中,都支持连接操作。

在ES这种分布式方案中进行连接操作,代价是十分昂贵的。

不过ES也提供了相类似的操作,支持水平任意扩展,实现连接的效果。

其他内容,参考Elasticsearch官方指南整理

ES中的连接

在ES中支持两种连接方式:嵌套查询 和 has_child、has_parent父子查询

嵌套查询:

文档中包含嵌套的字段,这些字段以数组的形式保存对象,这样每个嵌套的子对象都可以被搜索。

has_child、has_parent父子查询:

父子文档是存储在同一个索引中的不同类型,在索引数据前定义父子关系。在父子查询中,父子关系通过类型引用。

嵌套查询

嵌套类型需要实现定义好mapping:

{
"type1" : {
"properties" : {
"obj1" : {
"type" : "nested"
}
}
}
}

定义好后,type1中就有了obj1这个子对象,然后就可以通过嵌套查询查询相关的内容:

{
"nested" : {
"path" : "obj1",
"score_mode" : "avg",
"query" : {
"bool" : {
"must" : [
{
"match" : {"obj1.name" : "blue"}
},
{
"range" : {"obj1.count" : {"gt" : }}
}
]
}
}
}
}

注意其中几个参数:

1 path 定义了嵌套的对象

2 score_mode 定义里嵌套对象计算的分数与当前查询分数的处理方式,有avg,sum,max,min以及none。none就是不做任何处理,其他的看字面意思就好理解。

3 query/filter是查询的方式,内部定义了针对嵌套对象的查询,注意内部的查询一定要是用全路径,即针对obj1的name字段的查询,要写obj1.name。

嵌套查询会在执行子查询的时候自动触发,然后把结果返回给当前文档的查询。

父子查询

父子关系也需要在之前定义mapping,不过与一般的映射不同,它的定义方式如下:

PUT my_index
{
"mappings": {
"my_parent": {},
"my_child": {
"_parent": {
"type": "my_parent"
}
}
}
} PUT my_index/my_parent/
{
"text": "This is a parent document"
} PUT my_index/my_child/?parent=
{
"text": "This is a child document"
} PUT my_index/my_child/?parent=
{
"text": "This is another child document"
} GET my_index/my_parent/_search
{
"query": {
"has_child": {
"type": "my_child",
"query": {
"match": {
"text": "child document"
}
}
}
}
}

这样就代表,my_child这个类型的父类型是my_parent,这样就声明了一种父子关系。然后再索引数据时,指定父子对应的关系。

has_child查询

这个查询会检查子文档,如果子文档满足查询条件,则返回父文当。

{
"has_child" : {
"type" : "blog_tag",
"query" : {
"term" : {
"tag" : "something"
}
}
}
}

通过score_mode字段,可以指定子文档返回的分值的处理方式。与嵌套类似,它也有avg,sum,max,min和none几种方式。

{
"has_child" : {
"type" : "blog_tag",
"score_mode" : "sum",
"query" : {
"term" : {
"tag" : "something"
}
}
}
}

另外,也可以指定子文档匹配的最小数目和最大数目。

{
"has_child" : {
"type" : "blog_tag",
"score_mode" : "sum",
"min_children": ,
"max_children": ,
"query" : {
"term" : {
"tag" : "something"
}
}
}
}

has_parent查询

has_parent查询与has_child类似,它是去检查父文档那个是否匹配,然后返回父文档对应的子文档。

{
"has_parent" : {
"parent_type" : "blog",
"query" : {
"term" : {
"tag" : "something"
}
}
}
}

参考

1 如何定义父子关系:https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-parent-field.html

2 连接查询:https://www.elastic.co/guide/en/elasticsearch/reference/current/joining-queries.html

3 Nested查询:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-nested-query.html

4 Has_Child查询:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-has-child-query.html

5 Has_Parent查询:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-has-parent-query.html

Elasticsearch 连接查询的更多相关文章

  1. elasticsearch 连接查询 基于es5.1.1

    ElasticSerch 的连接查询有两种方式实现 nested parent和child关联查询 nested 存储结构 nested的方式和其他字段一样,在同一个type里面存储,以数组的方式存储 ...

  2. ElasticSearch—分页查询

    ElasticSearch查询—分页查询详解 Elasticsearch中数据都存储在分片中,当执行搜索时每个分片独立搜索后,数据再经过整合返回.那么,如何实现分页查询呢? 按照一般的查询流程来说,如 ...

  3. MySQL8:连接查询

    连接查询 连接是关系型数据库模型的主要特点. 连接查询是关系型数据库中最主要的查询,主要包括内连接.外连接等通过联结运算符可以实现多个表查询. 在关系型数据库管理系统中,表建立时各种数据之间的关系不必 ...

  4. SQL多表连接查询(详细实例)

    转载博客:joeleo博客(http://www.xker.com/page/e2012/0708/117368.html) 本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:stud ...

  5. Mysql联合,连接查询

    一. 联合查询    UNION, INTERSECT, EXCEPT UNION运算符可以将两个或两个以上Select语句的查询结果集合合并成一个结果集合显示,即执行联合查询.UNION的语法格式为 ...

  6. Oracle学习笔记五 SQL命令(三):Group by、排序、连接查询、子查询、分页

    GROUP BY和HAVING子句 GROUP BY子句 用于将信息划分为更小的组每一组行返回针对该组的单个结果 --统计每个部门的人数: Select count(*) from emp group ...

  7. SQL多表连接查询

    SQL多表连接查询 本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:student  截图如下: 表2:course  截图如下: (此时这样建表只是为了演示连接SQL语句,当然实际 ...

  8. mysql的查询、子查询及连接查询

    >>>>>>>>>> 一.mysql查询的五种子句         where(条件查询).having(筛选).group by(分组). ...

  9. oracle(sql)基础篇系列(二)——多表连接查询、子查询、视图

        多表连接查询 内连接(inner join) 目的:将多张表中能通过链接谓词或者链接运算符连接起来的数据查询出来. 等值连接(join...on(...=...)) --选出雇员的名字和雇员所 ...

随机推荐

  1. Bootstrap CDN推荐

    Bootstrap CDN推荐 本站实例采用的是百度的静态资源库(http://cdn.code.baidu.com/)上的Bootstrap资源. 百度的静态资源库的 CDN 服务,访问速度更快.加 ...

  2. [leetcode 35] Search Insert Position

    1 题目: Given a sorted array and a target value, return the index if the target is found. If not, retu ...

  3. wex5&.net开发

    一.环境开发 1.baas.net:菜单“窗口”->“首选项” 确定后左侧生成bass.net目录,设置iis网站目录(因为.net网站必须在iis中部署) 2.sqlserver:根据项目可选 ...

  4. Web Essentials之Bundling

    返回Web Essentials功能目录 本篇目录 介绍 样例文件 已知行为 介绍 这篇要讲的是Bundling,我看很多人把它翻译为捆绑,如果你喜欢你也可以这么理解,我是不太习惯,我还是喜欢它为bu ...

  5. 关于RPC与MQ异同的理解

    最近看了一些资料,回顾过去项目的经验,梳理自己对两者异同的理解: 相同: 1.都利于大型系统的解耦: 2.都提供子系统之间的交互,特别是异构子系统(如java\node等不同开发语言): 不同: 1. ...

  6. 项目开发之使用 maven

    本文将详述 maven 在软件项目中的使用.首先讲述 maven 的基本工作原理及环境的搭建.然后讲述开发及配置管理人员如何使用 maven,最后将介绍 maven 与 eclipse 集成使用. m ...

  7. 在XML drawable中引用自定义颜色

    == 先看一下一个xml drawable文件,这是一个button的样式. <?xml version="1.0" encoding="utf-8" ? ...

  8. C# socket编程实践——支持广播的简单socket服务器

    在上篇博客简单理解socket写完之后我就希望写出一个websocket的服务器了,但是一路困难重重,还是从基础开始吧,先搞定C# socket编程基本知识,写一个支持广播的简单server/clie ...

  9. PMO、P3O

    中国的大中型企业最近几年纷纷设立了项目管理办公室PMO,普遍关注如何发挥PMO最大的价值.而P3O指南描述了一个高阶的组织模型和机制,构建组织内部所有关于变革的决策支持与交付的结构及机制,允许永久的和 ...

  10. 知方可补不足~sqlserver中使用sp_who查看sql的进程

    回到目录 在SQLSERVER中每个会话,即每个查询分析器窗口都会产生一个SQL进程,对于那些持续时间短的进程,它们转瞬即失,而对于持续时间比较长的,我们需要希望查看它的运行状态,就可以借助SQL提供 ...