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种文档就需要使用聚合。
ElasticSearch关联查找的更多相关文章
- elasticsearch 关联查询
父-子关系文档 父-子关系文档 在实质上类似于 nested model :允许将一个对象实体和另外一个对象实体关联起来. 而这两种类型的主要区别是:在 nested objects 文档中,所有对象 ...
- elasticsearch 关联单词查询以及Shingles
Shingle Token Filter A token filter of type shingle that constructs shingles (token n-grams) from a ...
- EF LEFT JON 关联查找
var query = (from a in context.OQC_INSPECTION_SAMPLE.Where(expression).Where(a => context.OQC_INS ...
- Elasticsearch究竟要设置多少分片数?
0.引言 本文翻译自Elasticsearch20170918热乎的官方博客,原作者:Christian Dahlqvist. 在构建Elasticsearch集群的初期如果集群分片设置不合理,可能在 ...
- [moka同学笔记]Yii2中多表关联查询(join、joinwith) (摘录)
表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer (id customer_name) 订单表Order (id order_name cu ...
- Yii2.0中文开发向导——Yii2中多表关联查询(join、joinwith)(转)
我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer (id customer_name) 订单表Order (id order_ ...
- Yii2.0中文开发向导——Yii2中多表关联查询(join、joinwith)
我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer (id customer_name) 订单表Order (id order_ ...
- Yii多表关联
表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer (id customer_name) 订单表Order (id order_name ...
- Yii2中多表关联查询(hasOne、hasMany、join、joinwith)
表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer (id customer_name) 订单表Order (id order_name customer_id ...
随机推荐
- 关于ueditor与arcgis js api同用会报错的问题
在ueditor与arcgis js api共用时,需要将ueditor\third-party\zeroclipboard\ZeroClipboard.js中的 if (typeof define ...
- exe怎么找main函数
先说DEBUG版本的命令行EXE main函数有两种,第一种是int main(),第二种是int main(int argc,char* argv[]) 不管哪种只要查找j___p___argc就能 ...
- jvm编译环境搭建 win Vc篇
/************************************************************** 技术博客 http://www.cnblogs.com/itdef/ ...
- abp AutoMap Custom Mapping
[DependsOn(typeof(AbpAutoMapperModule))] public class MyModule : AbpModule { public override void Pr ...
- Python打开文件open()的注意事项
刚刚用open(fileName)来打开txt格式的文件,总是出现错误,总是找不到文件读取的内容,后来才发现是open()在使用过程中自动关闭了.这里介绍另种方法解决这个问题. 第一种方法. with ...
- JavaScript语言精粹 笔记06 方法
JS包含了少量可用在标准类型上的标准方法. ArrayFunctionNumberObjectRegExpString Array array.concat(item...) concat方法返回一个 ...
- HRBUST1213 单词接龙 2017-03-06 15:53 67人阅读 评论(0) 收藏
单词接龙 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙"(每个单词都最多在"龙&quo ...
- D3 数据可视化实战 笔记
学习真是件奇妙的事情.这本书我之前都看过,有些的知识点却完全没有印象. 总结:把用到的知识好好研究:平时可以了解其他技术的基础,把相关的资料和难点记录下来. javascript陷阱 1.变量类型 v ...
- (4)-optXXX方法的使用
在JSONObject获取value有多种方法,如果key不存在的话,这些方法无一例外的都会抛出异常.如果在线环境抛出异常,就会使出现error页面,影响用户体验,针对这种情况最好是使用optXXX方 ...
- Java下的框架编程(反射,泛型,元数据,CGLib,代码动态生成,AOP,动态语言嵌入)
Java 虽然没有动态语言般暴起,但仍然天连天,水接水的生出好多框架技术---反射(reflection),泛型(generics),元数据(annotation),proxies(proxy/cgl ...