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 6.x 父子文档[join]分析的更多相关文章
- elasticsearch父子文档处理(join)
elasticsearch父子文档处理 join 一.背景 二.需求 三.前置知识 四.实现步骤 1.创建 mapping 2.添加父文档数据 3.添加子文档 4.查询文档 1.根据父文档id查询它下 ...
- elasticsearch 父子文档(十一)
说明 需求 一个产品多个区域销售 每个区域有自己的价格, 方式1冗余行,a 产品分别在 area1 area2 area3区域销售 a产品就会生成3条产品数据 搜索id去重就行了,但是问题就是 聚合 ...
- ES 父子文档查询
父子文档的特点 1. 父/子文档是完全独立的. 2. 父文档更新不会影响子文档. 3. 子文档更新不会影响父文档或者其它子文档. 父子文档的映射与索引 1. 父子关系 type 的建立必须在索引新建或 ...
- Elasticsearch 7.x 之文档、索引和 REST API 【基础入门篇】
前几天写过一篇<Elasticsearch 7.x 最详细安装及配置>,今天继续最新版基础入门内容.这一篇简单总结了 Elasticsearch 7.x 之文档.索引和 REST API. ...
- 详细描述一下 Elasticsearch 更新和删除文档的过程?
1.删除和更新也都是写操作,但是 Elasticsearch 中的文档是不可变的,因此不 能被删除或者改动以展示其变更: 2.磁盘上的每个段都有一个相应的.del 文件.当删除请求发送后,文档并没有真 ...
- 【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 ...
- 12- APP接口测试以及接口文档的分析
什么是接口? 为什么要做接口测试? 接口测试流程 需求评审 需求分析 接口用例设计 执行测试用例 bug的定位于追踪 接口文档分析 接口文档分析:开发 内容: 1.接口名称 2.接口地址 3.支持方式 ...
随机推荐
- CentOS 7 / RHEL 7 运行单用户模式进行root的密码重置
步骤一,开机时随便按下键盘,进入以下菜单 步骤二: 选择第一项,按e键进行修改 步骤三,定位到 ro( linux 16 or linuxefi ) 步骤四:把ro改成 “rw init=/sys ...
- BZOJ 4765 普通计算姬 (分块 + BIT)
4765: 普通计算姬 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 1547 Solved: 329[Submit][Status][Discus ...
- Asp.net 修改已有数据的DataTable中某列的数据类型
DataTable dt_PI = new DataTable(); //克隆表结构 dt_PI = ds.Tables[].Clone(); dt_PI.Columns["FLTFullP ...
- WEB上传大文件解决方案
众所皆知,web上传大文件,一直是一个痛.上传文件大小限制,页面响应时间超时.这些都是web开发所必须直面的. 本文给出的解决方案是:前端实现数据流分片长传,后面接收完毕后合并文件的思路.下面贴出简易 ...
- 巧用NULL模式解耦依赖
1. 初始 应用A和应用B均用到了库libX.a中的类class A: 由于需求的变化,应用B需要库libM.a的能力,以便和服务M交互.为了复用和简化,通过类A间接提供,应用B不用修改代码,只需要重 ...
- listview 嵌套checkbox响应item点击和button点击事件
参考文档 http://www.eoeandroid.com/forum.php?mod=viewthread&tid=182280 一.主要要点 1. CheckBox的优先级比item高. ...
- VS2010与VS2013中的多字节编码与Unicode编码问题
1. 多字节字符与单字节字符 char与wchar_t 我们知道C++基本数据类型中表示字符的有两种:char.wchar_t. char叫多字节字符,一个char占一个字节,之所以叫多字节字符是因 ...
- hdu 5059 简单字符串处理
http://acm.hdu.edu.cn/showproblem.php?pid=5059 确定输入的数是否在(a,b)内 简单字符串处理 #include <cstdio> #incl ...
- JVM虚拟机---本地接口(我还不太会)
转载http://www.newhua.com/2008/0328/33542_2.shtml Java本地接口(Java Native Interface (JNI))允许运行在Java虚拟机(Ja ...
- express package.json解析
教程:http://www.tuicool.com/articles/vuiyIz