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_a2child_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 6.x 父子文档[join]分析的更多相关文章

  1. elasticsearch父子文档处理(join)

    elasticsearch父子文档处理 join 一.背景 二.需求 三.前置知识 四.实现步骤 1.创建 mapping 2.添加父文档数据 3.添加子文档 4.查询文档 1.根据父文档id查询它下 ...

  2. elasticsearch 父子文档(十一)

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

  3. ES 父子文档查询

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

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

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

  5. 详细描述一下 Elasticsearch 更新和删除文档的过程?

    1.删除和更新也都是写操作,但是 Elasticsearch 中的文档是不可变的,因此不 能被删除或者改动以展示其变更: 2.磁盘上的每个段都有一个相应的.del 文件.当删除请求发送后,文档并没有真 ...

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

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

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

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

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

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

  9. 12- APP接口测试以及接口文档的分析

    什么是接口? 为什么要做接口测试? 接口测试流程 需求评审 需求分析 接口用例设计 执行测试用例 bug的定位于追踪 接口文档分析 接口文档分析:开发 内容: 1.接口名称 2.接口地址 3.支持方式 ...

随机推荐

  1. vue中文章的折叠于显示全部

    在以一篇文章中,可能文章特别长,但是在页面第一次显示的时候可能就只需要显示一部分,这种情况下就需要自己进行修改 基本思路 利用类名就是预先定义一个类名,设置高度,和overflow:hidden,前提 ...

  2. 以太网MAC地址规范

    原文地址:http://blog.csdn.net/skyflying2012/article/details/40322563 之前一段时间在做网卡驱动的工作,现在产品量产,利用ifconfig e ...

  3. chmod用法

    以下是chmod的详细用法:chmod命令用于改变linux系统文件或目录的访问权限.用它控制文件或目录的访问权限.该命令有两种用法.一种是包含字母和操作符表达式的文字设定法:另一种是包含数字的数字设 ...

  4. php 16进制颜色代码转换为rgba,rgb格式

    <?php $rgb = hex2rgba('#FFFFFF', false, true); echo 'rgb: '.$rgb[0].','; echo $rgb[1].','; echo $ ...

  5. C++之const限定符(顶层const,底层const)

    作者:tongqingliu 转载请注明出处:http://www.cnblogs.com/liutongqing/p/7050815.html C++之const限定符(顶层const,底层cons ...

  6. Java理论学时第二节。课后作业。

    枚举不属于原始数据类型,它的每个具体值都引用一个特定的对象,相同的值则引用同一个对象. 可以使用“==”和equals()方法直接比对枚举变量的值,换句话说,对于枚举类型的变量,“==”和equals ...

  7. A Magic Lamp -- hdu -- 3183

    http://acm.hdu.edu.cn/showproblem.php?pid=3183 A Magic Lamp Time Limit: 2000/1000 MS (Java/Others)   ...

  8. POJ3320 Jessica's Reading Problem 2017-05-25 19:55 38人阅读 评论(0) 收藏

    Jessica's Reading Problem Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12346   Accep ...

  9. Scala_关键字

    关键字 Lazy Scala中用lazy定义的变量叫惰性变量,会实现延迟加载:惰性变量只能是不可变变量,而且只有在调用惰性变量时,才会去实列化这个变量 object ScalaLazyDemo1{   ...

  10. AngularJS 过滤器 Filter

    过滤器实质是数据转换或过滤,把ViewMode中的数据转化成View层用户友好的信息.可以看做一个函数,负责接收输入,转换成输出,每次参数变化时,它就被执行,输出被视图View使用. 一.基本定义及其 ...