`
m635674608
  • 浏览: 5009389 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

ElasticSearch关联查找

 
阅读更多

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种文档就需要使用聚合。

 

https://segmentfault.com/a/1190000002803966?utm_source=tuicool

分享到:
评论

相关推荐

    Elasticsearch工具类

    关联查询在Elasticsearch中可以通过嵌套文档、父子文档或者多字段查询等方式实现。这些查询方式可以帮助我们处理复杂的数据关系,比如在一个文档中查找与之关联的其他文档。 文件名为"esutil"的类可能包含了上述...

    elasticsearch-6.2.4.tar.gz

    安装Elasticsearch 6.2.4时,你需要先解压缩"elasticsearch-6.2.4.tar.gz",然后在终端中导航到解压后的"es6.2.4"目录,执行启动脚本`bin/elasticsearch`。确保你的系统满足Elasticsearch的硬件和软件需求,并根据...

    Elasticsearch示例数据 logs.json shakespeare.json accounts.json

    例如,通过Elasticsearch,我们可以轻松地查找特定用户的活动记录,或者找出具有特定属性(如地理位置、注册日期等)的用户群体。 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和...

    Apache Hadoop---Elasticsearch.docx

    \n\n- **倒排索引(Inverted Index)**:倒排索引是 Elasticsearch 快速全文搜索的基础,它将文档的词汇与文档ID关联,便于高效查找含有特定词汇的文档。每个字段都有自己的倒排索引,这使得 Elasticsearch 能够处理...

    第13单元 ElasticSearch入门1

    【Elasticsearch 入门详解】 Elasticsearch 是一款基于 Lucene 的开源全文搜索引擎,它以 RESTful 风格的 API 进行交互,具备分布式、可扩展、实时搜索和数据分析的能力。作为企业级搜索引擎,Elasticsearch 可轻松...

    ElasticSearch八大经典应用.rar

    Elasticsearch(简称ES)是一款强大的开源搜索引擎,以其分布式、实时、可扩展的特性赢得了广泛的认可。在众多的数据处理和搜索场景中,ES展现了其独特的价值。以下是根据标题和描述概括的八大经典应用场景: 1. **...

    精选7道Elastic Search面试题!.zip

    Elasticsearch(简称ES)是一种基于Lucene的分布式、RESTful搜索分析引擎,广泛应用于日志分析、实时监控、数据搜索等领域。以下精选的7道Elasticsearch面试题旨在帮助你深入理解其核心概念和技术: 1. **什么是...

    Elasticsearch 28道面试题和答案.docx

    在 Elasticsearch 中,倒排索引是一种特殊的数据结构,用于高效地支持全文搜索。它将每个词项(token)与包含该词项的文档列表关联起来,而不是像传统的索引那样将文档与关键词关联。这样,当查询词项时,搜索引擎只...

    Mastering ElasticSearch 5.0

    ### 掌握ElasticSearch 5.0:深入理解与应用 #### 一、ElasticSearch与Lucene概述 **1. Lucene简介** - **Lucene**是Apache下的一个开源全文检索库,它是ElasticSearch的核心组件之一。 - **深入Lucene索引机制*...

    elasticsearch:Elasticsearch

    Elasticsearch(简称ES)是一款开源的、基于Lucene的全文搜索引擎,由Java编写,并采用分布式、RESTful架构设计。它旨在提供快速、可扩展的近实时搜索功能,同时也支持数据分析和聚合操作。在大数据时代,Elastic...

    es搜索引擎.doc

    Elasticsearch(ES)是一个高效、可扩展的分布式搜索服务器,基于Apache Lucene构建,具有丰富的功能和强大的性能。它不仅提供了开箱即用的体验,还通过RESTful接口简化了Lucene的复杂操作,使得用户能够方便地进行...

    eshead 121212111

    6. **标签"eshead"**:这可能是用户用来标记与Elasticsearch Head 相关的任何资源、问题或讨论,以方便后期查找和分类。 至于压缩包文件"extension_0_1_3",由于没有更多的上下文信息,我们无法确定它具体与Elastic...

    使用ES+JavaWeb实现关键词索引相关文章内容

    本文将深入探讨如何使用Elasticsearch(简称ES)与JavaWeb技术来实现关键词索引,并关联相关文章内容。Elasticsearch是一个分布式、RESTful风格的搜索和数据分析引擎,能够用于实时的全文搜索,同时提供分析和存储...

    elasticsearch_tmp

    Elasticsearch(简称ES)是一款基于Lucene的开源全文搜索引擎,它以其分布式、实时、可扩展的特性,广泛应用于日志分析、监控、搜索、大数据分析等多个领域。"elasticsearch_tmp"可能是一个与Elasticsearch相关的...

    yii-search:用于Yii2的elasticsearch

    1. **模型集成**:通过简单的配置,可以让Yii2的模型与Elasticsearch索引关联,使得数据库中的数据能够自动同步到Elasticsearch中。 2. **搜索API**:提供了一套与Yii2相一致的查询构造器API,允许开发者使用熟悉的...

    sense.crx - chrome插件 - es

    "sense"是插件的名称,"elasticsearc"可能是标签输入错误,正确应该是"Elasticsearch",这表明插件与这个搜索引擎紧密关联。而"es"是Elasticsearch的常见缩写,进一步确认了插件的功能和用途。 【知识点详解】 1. ...

    elastisearch 全文检索

    在 Elasticsearch 中,每个词项(token)都会关联到包含该词项的所有文档的列表,从而极大地提高了查询效率。在用户输入查询后,系统会快速找到包含所有查询词项的文档,而不是逐一检查每个文档。 **4. JSON 文档...

    docker-compose_Docker_

    E: elasticsearch ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。 也就是将logstach收集上来的日志储存,建立索引(便于查找),搜索(提供web...

Global site tag (gtag.js) - Google Analytics