前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Elasticsearch 连接查询

Elasticsearch 连接查询

作者头像
用户1154259
发布于 2018-01-17 08:11:31
发布于 2018-01-17 08:11:31
2.9K00
代码可运行
举报
运行总次数:0
代码可运行

在一般的关系型数据库中,都支持连接操作。 在ES这种分布式方案中进行连接操作,代价是十分昂贵的。 不过ES也提供了相类似的操作,支持水平任意扩展,实现连接的效果。 其他内容,参考Elasticsearch官方指南整理

ES中的连接

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

嵌套查询:

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

has_child、has_parent父子查询:

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

嵌套查询

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "type1" : {
        "properties" : {
            "obj1" : {
                "type" : "nested"
            }
        }
    }
}

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "nested" : {
        "path" : "obj1",
        "score_mode" : "avg",
        "query" : {
            "bool" : {
                "must" : [
                    {
                        "match" : {"obj1.name" : "blue"}
                    },
                    {
                        "range" : {"obj1.count" : {"gt" : 5}}
                    }
                ]
            }
        }
    }
}

注意其中几个参数:

1 path 定义了嵌套的对象

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

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

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

父子查询

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
PUT my_index
{
  "mappings": {
    "my_parent": {},
    "my_child": {
      "_parent": {
        "type": "my_parent" 
      }
    }
  }
}

PUT my_index/my_parent/1 
{
  "text": "This is a parent document"
}

PUT my_index/my_child/2?parent=1 
{
  "text": "This is a child document"
}

PUT my_index/my_child/3?parent=1 
{
  "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查询

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "has_child" : {
        "type" : "blog_tag",
        "query" : {
            "term" : {
                "tag" : "something"
            }
        }
    }
}

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "has_child" : {
        "type" : "blog_tag",
        "score_mode" : "sum",
        "query" : {
            "term" : {
                "tag" : "something"
            }
        }
    }
}

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "has_child" : {
        "type" : "blog_tag",
        "score_mode" : "sum",
        "min_children": 2, 
        "max_children": 10, 
        "query" : {
            "term" : {
                "tag" : "something"
            }
        }
    }
}

has_parent查询

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-11-19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
一起学Elasticsearch系列 -Nested & Join
ES的 Nested 类型用于处理在一个文档中嵌套复杂的结构数据,而 Join 类型用于建立父子文档之间的关联关系。
BookSea
2023/12/20
4870
一起学Elasticsearch系列 -Nested & Join
ElasticSearch 6.x 学习笔记:13.mapping元字段
mapping元字段官网文档 https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-fields.html#_document_source_meta_fields
程裕强
2022/05/06
4980
Elasticsearch之元数据(meta-fields)介绍
在Elasticsearch下,一个文档除了有数据之外,它还包含了元数据(Metadata)。每创建一条数据时,都会对元数据进行写入等操作,当然有些元数据是在创建mapping的时候就会设置,
高广超
2018/12/12
2.7K0
Elasticsearch的Mapping之元数据类型
在es中,mapping的存在类似数据库的表结构定义或者solr里面的schemal文件,它里面定义了每个添加的doc的处理方式。 mapping type定义了不同的逻辑上组隔离,这一点类似于数据库的各个表,例如用户表,订单表,商品表,在es里面 每个表都有自己的一个mapping type,每个mapping type包含: 元数据字段: (1),身份元数据 _index : 此doc例如于那个index名 , 自动被索引,可被查询,聚合,排序使用,或者脚本里访问 _type:
我是攻城师
2018/05/14
1.2K0
Elasticsearch中父子文档的关联:利用Join类型赋予文档的层级关系
在Elasticsearch的实际应用中,嵌套文档是一个常见的需求,尤其是当我们需要对对象数组进行独立索引和查询时。在Elasticsearch中,这类嵌套结构被称为父子文档,它们能够“彼此独立地进行查询”。实现这一功能主要有两种方式:
公众号:码到三十五
2024/04/20
5660
Elasticsearch中父子文档的关联:利用Join类型赋予文档的层级关系
ElasticSearch5.0之后的改变
ES5的变化 search_type=count和scan都移除了 count可以用size=0代替 GET /my_index/_search { "size": 0, "aggs": {
老梁
2019/09/10
9930
ElasticSearch 6.x 学习笔记:17.词项查询
词项查询官网: https://www.elastic.co/guide/en/elasticsearch/reference/6.1/term-level-queries.html
程裕强
2022/05/06
1.3K0
一步一步理解Elasticsearch中的object,nested,join数据类型
为了更好的理解三种数据类型之间不同,尽量使用相的数据,相同的mapping, 只是数据类型不一样。
周银辉
2024/08/05
3080
白话Elasticsearch23-深度探秘搜索技术之通过ngram分词机制实现index-time搜索推荐
NGram Tokenizer: https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-ngram-tokenizer.html
小小工匠
2021/08/17
6440
Elasticsearch 聚合性能优化六大猛招
默认情况下,Elasticsearch 已针对大多数用例进行了优化,确保在写入性能和查询性能之间取得平衡。我们将介绍一些聚合性能优化的可配置参数,其中部分改进是以牺牲写入性能为代价的。目标是将聚合优化招数汇总到一个易于消化的短文中,为大家的 Elasticsearch 集群聚合性能优化提供一些指导。
铭毅天下
2021/02/03
4.1K0
Elasticsearch 聚合性能优化六大猛招
Elasticsearch使用:父-子关系文档(上)
官网地址:https://www.elastic.co/guide/cn/elasticsearch/guide/current/parent-child.html
HLee
2021/04/23
3.8K0
Elasticsearch使用:父-子关系文档(上)
【干货】Elasticsearch搜索调优权威指南 (1/3)
Elasticsearch搜索调优权威指南,是QBOX在其博客上发布的系列文章之一,本文是该系列的第一篇,主要从文档建模、内存分配、文件系统缓存、GC和硬件等方面介绍了优化查询性能的一些经验;后续还会有该系列的另外两篇文章,敬请期待。
杨振涛
2019/03/19
8180
【干货】Elasticsearch搜索调优权威指南 (1/3)
Elasticsearch使用:父-子关系文档(下)
父子文档在理解上来说,可以理解为一个关联查询,有些类似MySQL中的JOIN查询,通过某个字段关系来关联。父子文档与嵌套文档主要的区别在于,父子文档的父对象和子对象都是独立的文档,而嵌套文档中都在同一个文档中存储。如下图所示:
HLee
2021/04/25
1.9K0
Elasticsearch使用:父-子关系文档(下)
触类旁通Elasticsearch:关联
ES本身不支持SQL数据库的join操作,在ES中定义关系的方法有对象类型、嵌套文档、父子关系和反规范化。
用户1148526
2019/05/25
6.3K0
ElasticSearch join连接查询「建议收藏」
大家好,又见面了,我是你们的朋友全栈君。 ElasticSearch join连接查询 特别说明:文章所有内容基于ElasticSerch 5.5.3版本 ElasticSerch 的连接查询有两种方式实现 nested parent和child关联查询 ---- nested 存储结构 nested的方式和其他字段一样,在同一个type里面存储,以数组的方式存储在 type里,格式如下: PUT index_test/type_info/1000 { "userId": 10
全栈程序员站长
2022/07/04
8340
Elasticsearch(二) 文档关系分析
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
张凝可
2019/08/21
1.2K0
ElasticSearch最全详细使用教程:入门、索引管理、映射详解
墨墨导读:本文介绍了ElasticSearch的必备知识:从入门、索引管理到映射详解。
数据和云
2019/08/12
3.1K0
ElasticSearch最全详细使用教程:入门、索引管理、映射详解
071. ElasticSearch 应用场景及核心概念
1. ES 使用场景 ---- 给网站 / APP 添加搜索功能。 存储、分析数据。 管理、交互、分析空间信息,将 ES 用于 GIS。 2. ES 简介 ---- Elasticsearch 是一个
山海散人
2021/03/03
1.1K0
071. ElasticSearch 应用场景及核心概念
白话Elasticsearch60-数据建模实战_Join datatype 父子关系数据建模
白话Elasticsearch58-数据建模实战_基于nested object实现博客与评论嵌套关系
小小工匠
2021/08/17
2960
简述ElasticSearch里面复杂关系数据的存储方式
在传统的数据库里面,对数据关系描述无外乎三种,一对一,一对多和多对多的关系,如果有关联关系的数据,通常我们在建表的时候会添加主外键来建立数据联系,然后在查询或者统计时候通过join来还原或者补全数据,最终得到我们需要的结果数据,那么转化到ElasticSearch里面,如何或者怎样来处理这些带有关系的数据。 我们都知道ElasticSearch是一个NoSQL类型的数据库,本身是弱化了对关系的处理,因为像lucene,es,solr这样的全文检索框架对性能要求都是比较高的,一旦出现join这样的操作,性能会
我是攻城师
2018/05/14
5.2K0
推荐阅读
相关推荐
一起学Elasticsearch系列 -Nested & Join
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文