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. max10之pll时钟源切换

    问题3:PLL切换功能中,多次切换可能造成PLL锁不定 从现象看clkbadx信号是不影响的,但locked信号一定是有影响的.

  2. 20155205 《Java程序设计》实验三(敏捷开发与XP实践)实验报告

    20155205 <Java程序设计>实验三(敏捷开发与XP实践)实验报告 一.实验内容及步骤 (一)使用Code菜单 在IDEA中使用工具(Code->Reformate Code ...

  3. Eclipse sysout 和 fore 不起作用

    Content Assist ↑ 这是主角,可以快速生成语句. sysout 快捷键之后生成了 System.out.println(); fore 快捷键之后生成了 for(String arg : ...

  4. Linux批量远程命令和上传下载工具

    https://github.com/eyjian/mooon/releases/tag/mooon-tools mooon_ssh:批量远程命令工具,在多台机器上执行指定命令 mooon_uploa ...

  5. (打表+优化)简单的求和 -- zzuli -- 1783

    http://acm.zzuli.edu.cn/problem.php?id=1783 1783: 简单的求和 Time Limit: 1 Sec  Memory Limit: 128 MBSubmi ...

  6. kepware http接口 javascript开发

    读取某变量的值(jquery var settings = { "async": true, "crossDomain": true, "url&qu ...

  7. FileZilla_server在Windows和Linnx下的部署安装

    1. FileZilla官网下载FileZilla Server服务器,目前最新版本为0.9.53. 2. 安装FileZilla服务器.除以下声明的地方外,其它均采用默认模式,如安装路径等. 2.1 ...

  8. shell 命令 查看本机ip

    ifconfig 结果有很多,查看env0的inet,就是本机的ip地址

  9. Xcode一些好用的插件,以及这些插件的管理器

    最近从xcode6.4升级到xcode7,发现以前所有的插件都失效了,如果要安装,需要重新去一个个下载.安装,很麻烦. 于是,转来了这篇博文,亲自测试,发现很好用...... 地址:http://11 ...

  10. Win7下无法启动sql server fulltext search (mssqlserver)的问题

    在Win7下安装了SQL Server 2005, 但启动“SQL Server FullText Search (MSSQLSERVER)”服务时启动不成功,系统日志显示“SQL Server Fu ...