ElasticSearch关联查找

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

使用nested:

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

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

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

使用内嵌的类型的优点在于一次查询,自己的文档和内嵌的文档一块儿返回。惟一不方便的就是对内嵌数据进行插入或者删除操做的时候须要使用Update模块,Update对数据的操做都是经过脚本实现的,我的感受使用起来不是很方便。为了解决这个问题,咱们可使用新方法,parent-child模块。curl

使用parent-child:

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

{
    "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的数据的时候,咱们须要这样写:ide

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

这里咱们插入了一条id为user_id的数据,而且和id为test_id的数据关联。
接下来咱们能够经过child的属性去查找parentui

{
    "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种文档就须要使用聚合。url

相关文章
相关标签/搜索