elasticsearch的父子_ElasticSearch 6.x 父子文档[join]分析

ES6.0以后,索引的type只能有一个,使得父子结构变的不那么清晰,毕竟对于java开发者来说,index->db,type->table的结构比较容易理解。

按照官方的说明,之前一个索引有多个type,如果有一个相同的字段在不同的type中出现,在ES底层其实是按照一个field来做lucene索引的,这很具有迷惑性,容易造成误解。所以6.0以后,所有的字段都在索引的_doc【默认type】中集中定义。假设索引中会有parent和child两个类型的文档,那么可能parent引用了abcd字段,child引用了aef字段,各取所需。

目前我用的es版本为6.3,父子结构需要用join字段来定义,关系的映射用relations字段来指定。

一个索引中只能有一个join类型字段,如果定义一个以上的join字段,会报错:Field [_parent_join] is defined twice in [_doc]

join字段中的relations集合,建好索引之后,可以增加映射,或者给原有的映射添加child,但是不能删除原有的映射。

比如,原有的relations定义为:

"myJoin": {

"type": "join",

"eager_global_ordinals": true,

"relations": {

"parent_a": child_a1

}

}

现在通过updateMapping API增加一条映射parent_b,原有的映射增加了child_a2和child_a3:

"myJoin": {

"type": "join",

"eager_global_ordinals": true,

"relations": {

"parent_a": [

"child_a1",

"child_a2",

"child_a3"

],

"parent_b": "child_b"

}

}

中午睡了个午觉,接着再写一点join的操作

根据子文档查询父文档

GET /test_index_join/_search

{

"query": {

"has_child": {

"type": "child_a1",

"score_mode": "max",

# 基于child_a1文档定义来搜索,query里的查询字段是child_a1里的

"query": {

"term": {

"salesCount": 100

}

}

}

}

}

根据子文档对父文档进行排序

说明:根据子文档的字段影响父文档的的得分,然后父文档根据_score来排序。

下面例子中,父文档的得分为:_score * child_a1.salesCount,score_mode可以是min,max,sum,avg,first等。

GET /test_index_join/_search

{

"query": {

"has_child": {

"type": "child_a1",

"score_mode": "max",

"query": {

"function_score": {

"script_score": {

"script": "_score * doc['salesCount'].value"

}

}

}

}

},

"sort": [

{

"_score": {

"order": "asc"

}

}

]

}

还可以依赖field_value_factor来影响父文档得分,效果相似,效率更高;functions支持多个field影响因子,多个因子的默认[score_mode]计分模式为multiply[相乘],还有其他可选模式为:min,max,avg,sum,first,multiply。

下面例子中,父文档的得分为:salesCount,因为没有其他的影响因子,如果有多个,则取最大的一个,因为score_mode为max。

GET /test_index_join/_search

{

"query": {

"has_child": {

"type": "child_a1",

"score_mode": "max",

"query": {

"function_score": {

"functions": [

{

"field_value_factor": {

"field": "salesCount"

}

}

]

}

}

}

},

"sort": [

{

"_score": {

"order": "asc"

}

}

]

}

根据父文档查询子文档

GET /test_index_join/_search

{

"query": {

"has_parent": {

"parent_type": "parnet_a",

# 基于parnet_a来搜索,query里的查询字段是parnet_a里的

"query": {

"range": {

"price": {

"gt": 1,

"lte": 200

}

}

}

}

}

}

elasticsearch 父子文档(十一)

说明 需求 一个产品多个区域销售 每个区域有自己的价格, 方式1冗余行,a 产品分别在  area1 area2 area3区域销售 a产品就会生成3条产品数据 搜索id去重就行了,但是问题就是 聚合 ...

ES 父子文档查询

父子文档的特点 1. 父/子文档是完全独立的. 2. 父文档更新不会影响子文档. 3. 子文档更新不会影响父文档或者其它子文档. 父子文档的映射与索引 1. 父子关系 type 的建立必须在索引新建或 ...

Elasticsearch 7.x 之文档、索引和 REST API 【基础入门篇】

前几天写过一篇,今天继续最新版基础入门内容.这一篇简单总结了 Elasticsearch 7.x 之文档.索引和 REST API. ...

【SharePoint 文档管理解决方案设计系列一】文档使用分析

在我们在 SharePoint 端设计文档管理解决方案之前我们要了解目前客户在他们已有的系统里是怎么对文档进行使用和管理的.只有了解了当前的使用情况才能根据客户的需求量身定做一套适合他们的有效的解决方 ...

elasticsearch 第五篇(文档操作接口)

INDEX API 示例: 1 2 3 4 5 PUT /test/user/1 { "name": "silence", "age": 2 ...

MFC单文档框架分析及执行流程(转)

原文转自 https://blog.csdn.net/u011619422/article/details/40402705 首先来分析一下MFC单文档类的结构: 它包括如下几个类: CAboutDl ...

Elasticsearch (1) - 索引库 文档 分词

创建索引库 ES的索引库是一个逻辑概念,它包括了分词列表及文档列表,同一个索引库中存储了相同类型的文档.它就相当于MySQL中的表,或相当于Mongodb中的集合. 关于索引这个语: 索引(名词):E ...

Week3——文档代码分析

该段代码代码显示了不使用异步处理的基本servlet: @WebServlet(urlPatterns={"/syncservlet"}) public class SyncSer ...

Elasticsearch 插入地理索引文档一直为空

今天在获取插入索引数据的时候,一直提示插入不成功,尝试了很多方法,原来是因为在插入的时候应该先 插入Latitude后插入longitude修改后的代码如下 public boolean insert ...

随机推荐

JQuery.validate.js 表单验证

官方网站:http://bassistance.de/jquery-plugins/jquery-plugin-validation/API: http://jquery.bassistance.de ...

Android(java)学习笔记187:Android中操作XML数据(使用Pull解析器)

1. Pull解析器的运行方式与 SAX 解析器相似.它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件.跟SAX不同的是, Pull解析器 ...

Linux显示内存统计最大和最小的详情

Linux显示内存统计最大和最小的详情 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ free -l total used free shared buffe ...

[BZOJ]4644: 经典傻逼题

某天我觉得一切题目都是那么不可做,于是百度了一下"傻逼题"-- 题目大意:对于图中的任意一个点集(可以为空或者全集),所有恰好有一个端点在这个点集中的边组成的集合被称为割.一个割的 ...

产品经理之UML表达业务逻辑

文章大纲 一. 什么是UML二. UML基础介绍三.UML实例介绍四.参考文档   一. 什么是UML   UML(Unified Modeling Language,统一建模语言) 是一种在软件设计 ...

unity中将多个图片进行椭圆排序

//保存需要排序的精灵容器 public GameObject[] Sprites; public Transform centrePoint;//椭圆的中心点 ;//每个方块间的角度偏移 //保存位 ...

Ubuntu16.04+CUDA8.0+cudnn6

按之前的方法给TITAN X安装cuda8.0会发生循环登录的问题,因此换了一种安装方法 参考:https://www.jianshu.com/p/002ece426793,http://blog.c ...

innosetup 安装前、卸载前判断是否有进程正在运行<转>

[Code] //安装前判断是否有进程正在运行,istask.dll文件与打包的exe文件一起 function RunTask(FileName: string; bFullpath: Boolea ...

codeforces 798B - Mike and strings

感觉自己好咸鱼呀……B题写了这么久,虽然可以算作1A(忽略一次少include一个头文件的CE)…… 思想很简单,每次选定一个字符串作为目标字符串,然后把其他所有字符串都当做测试字符串,计算出总共需要 ...

揭秘 Python 中的 enumerate() 函数

原文:https://mp.weixin.qq.com/s/Jm7YiCA20RDSTrF4dHeykQ 如何以去写以及为什么你应该使用Python中的内置枚举函数来编写更干净更加Pythonic的循 ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值