`
weitao1026
  • 浏览: 1048281 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

es的连接查询

 
阅读更多

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

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

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

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

http://www.cnblogs.com/xing901022/p/4704319.html

 

 

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" : 5}}
                    }
                ]
            }
        }
    }
}
复制代码

 

注意其中几个参数:

 

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/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查询

 

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

 

复制代码
{
    "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": 2, 
        "max_children": 10, 
        "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

 

分享到:
评论

相关推荐

    ES查询客户端,elasticsearch可视化工具 elasticsearch查询客户端

    Elasticsearch查询客户端是用于与ES服务器通信的软件,它们提供了多种语言的API,允许开发者以编程方式执行索引、搜索、更新和删除等操作。常见的Elasticsearch客户端包括: - **Jest**:一个轻量级的Java REST...

    flink-es7:为了使用Elasticsearch连接器,使用构建自动化工具(如Maven或SBT)的两个项目和带有SQL

    flink-es7:为了使用Elasticsearch连接器,使用构建自动化工具(如Maven或SBT)的两个项目和带有SQL

    Elasticsearch数据库的连接客户端

    图形化界面连接Elasticsearch,方便开发人员操作,elasticsearch的客户端比较出名的就是elasticsearch head 和Kibana了, 但是elasticsearch head已经停止更新,且样式老旧,功能不全; 而Kibana虽功能全面,但是启动...

    elasticsearch连接工具-elasticHD(windows和linux版本)-百度网盘下载

    下载内容: elasticHD_windows_amd64.zip elasticHD_linux_amd64.zip elasticsearch连接工具

    ElasticSearchPoolUtil.java(es连接池工具类)

    使用过Elasticsearch RestFul API的都知道,在Java端使用是ES服务需要创建Java Client,但是每一次连接都实例化一个client,对系统的消耗很大,而且最令人头疼的是它的连接非常慢。所以为了解决上述问题并提高client...

    linux命令行elasticsearch查询工具es2unix

    "es2unix"就是这样一个工具,它将Elasticsearch的查询结果转换为Unix可读格式,使得我们可以利用Unix命令如grep、awk和sed等进行进一步的数据处理。 **es2unix工具介绍** es2unix是一个专门针对Elasticsearch的...

    谷歌插件es连接插件包.zip

    【标题】"谷歌插件es连接插件包.zip"指的是一个包含了与Elasticsearch(简称ES)相关的谷歌浏览器扩展程序的压缩文件。这个插件包主要用于帮助用户在谷歌浏览器上更方便地与Elasticsearch集群进行交互和管理。 ...

    连接阿里elasticsearch连接客户端代码

    连接阿里elasticsearch连接客户端代码,elasticsearch5.3.3

    ElasticSearch连接池全套封装

    **Elasticsearch 连接池全方位解析** 在大数据和实时搜索领域,Elasticsearch(ES)因其高效、灵活和可扩展性而广受欢迎。为了优化性能和提高稳定性,使用连接池来管理与 ES 节点间的连接是必要的。本文将深入探讨 ...

    ElasticSearch客户端工具

    ElasticSearch客户端工具是用于管理和操作Elasticsearch(ES)集群的重要软件,它们提供了一种直观、高效的方式来查看和管理ES集群的状态、索引、文档以及执行查询和分析任务。这些工具极大地简化了对Elasticsearch...

    PHP中 对es中的数据分页 查询

    本文将详细探讨在PHP中如何对Elasticsearch(ES)中的数据进行分页查询,以及相关的封装技巧。 首先,我们需要理解Elasticsearch的数据分页原理。在ES中,分页主要通过两个参数实现:`from` 和 `size`。`from` 参数...

    Go-go-elasticsearch:Elasticsearch官方的go语言客户端

    - **连接池管理**:支持连接池,能有效管理与Elasticsearch节点的连接,提高性能和可靠性。 - **请求构建器**:提供易于使用的API来构建复杂的Elasticsearch请求。 - **异步操作**:支持异步API调用,便于在Go的并发...

    es-head Elasticsearch的可视化操作插件

    es-head是一个针对Elasticsearch的可视化操作插件。它提供了一个便捷的操作工具,可以连接Elasticsearch搜索引擎,并提供可视化的操作页面,对Elasticsearch进行各种设置和数据检索功能的管理。 es-head 插件可以在...

    ES客户端+谷歌浏览器插件+Multi-Elasticsearch-Head

    它基于Elasticsearch-Head或者Kibana的Dev Tools Console概念,但是增加了同时连接和管理多个Elasticsearch实例或集群的能力。这意味着用户可以通过一个统一的界面执行搜索、浏览索引、管理文档、监控集群状态以及...

    elasticsearch及其链接工具使用方法.zip

    elasticsearch和elasticsearch-head-master包安装及其使用

    elasticsearch demo 包括本地测试ElasticSearchCreate 增加 删除 修改 查询 和 连接服务器 demo

    本示例将详细解释如何在本地环境中进行Elasticsearch的创建、增加、删除、修改和查询操作,以及如何连接到远程服务器进行相关操作。** ### 1. Elasticsearch安装与启动 首先,你需要下载并安装Elasticsearch。访问...

    elasticvue插件无缝连接elasticsearch

    还在安装kibana吗,推荐使用elasticvue插件无缝连接elasticsearch

    ElasticSearch-head插件

    **Elasticsearch-head插件详解** Elasticsearch是一款强大的分布式搜索和分析引擎,广泛应用于日志分析、全文检索、实时数据分析等领域。然而,作为一个命令行工具,它的操作并不直观,尤其是对于初学者而言。这时...

    java elasticsearch 存储查询

    `exception`目录可能包含了一些自定义异常类,用于捕获和处理与Elasticsearch交互时可能出现的错误,如连接问题、索引不存在或查询失败等。 最后,`server`目录可能包含了与Elasticsearch服务器通信的相关配置或...

    ElasticSearch Java API 中文文档

    详细介绍了ElasticSearch的查询语言(Domain Specific Language),包括全量查询(Match All Query)、全文查询(Full Text Queries)、词项级查询(Term level queries)、复合查询(Compound queries)、连接查询...

Global site tag (gtag.js) - Google Analytics