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.支持方式 ...
随机推荐
- IntelliJ IDEA 2017版 编译器使用学习笔记(九)(图文详尽版);IDE使用的有趣的插件;IDE代码统计器;Mybatis插件
一.代码统计器,按照名字搜索即可,在file===setting------plugin 使用右键项目:点击自动统计 二.json转实体类 三.自动找寻bug插件 四.Remind me工具 五.检测 ...
- 自定义cell的高度
// // RootTableViewController.m // Share // // Created by lanouhn on 15/1/20. // Copyright (c) 2 ...
- How to fix "http error 403.14 - forbidden" in IIS7
If you encounter the following error: "http error 403.14 - forbidden. The Web server is configu ...
- _编程语言_C++_简介
扩展名: .cpp..cp或.c C++编译器: GNU的gcc 编译器
- eclipse编辑器栏上的路径怎么去掉
找到这个按钮,点一下就可以了:
- css的三种使用方式:行内样式,内嵌样式,外部引用样式
三中的使用方法的简单实例如下: 行内样式: <!doctype html> <html> <head> <meta charset="UTF-8&q ...
- Hdu4135 Co-prime 2017-06-27 16:03 25人阅读 评论(0) 收藏
Co-prime Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Subm ...
- 安装Chrome浏览器
Ubuntu 16.04下安装64位谷歌Chrome浏览器 在 Ubuntu 16.04 中,要想使用谷歌的 Chrome 浏览器,可以通过命令行的方式手动安装. 1.进入 Ubuntu 16.04 ...
- CentOS 7.2通过yum安装MairaDB 10.1
CentOS 7.2自带的yum源中mysql已经被替换成了mariadb,然而却是5.5版本,匹配mysql5.5,想要使用mysql 5.7的特性需要mariadb 10.0或10.1版本,10. ...
- Lerning Entity Framework 6 ------ Defining the Database Structure
There are three ways to define the database structure by Entity Framework API. They are: Attributes ...