ElasticsearchJoin字段类型简单快速上手教程_第1页
ElasticsearchJoin字段类型简单快速上手教程_第2页
ElasticsearchJoin字段类型简单快速上手教程_第3页
ElasticsearchJoin字段类型简单快速上手教程_第4页
ElasticsearchJoin字段类型简单快速上手教程_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第ElasticsearchJoin字段类型简单快速上手教程目录概述父子关系的限制Globalordinals父子文档总结阅读本文需要一定的Elasticsearch基础哦,本文深度有,但是不深

概述

Elasticsearch中Join数据类型的字段相信大家也都用过,也就是口中常谈的父子文档。在Elasticsearch中Join不能跨索引和分片,所以保存文档信息时要保证父子文档使用相同的路由参数来保证父文档与子文档保存在同一个索引的同一个分片,那么都有哪些限制呢?

父子关系的限制

每个索引中只能有一个关系字段父文档与子文档必须在同一个索引分片中,所以我们在对父子文档增加、删除、修改时要设置路由值,保证数据都在同一分片一个父文档可以包含多个子文档,但是一个子文档只能有一个父文档只能在Join类型的字段上建立关系在保证当前文档是父文档的前提下可以增加子文档

Globalordinals

翻译过来就是全局序数。什么是全局序数呢,官方文档中说明了,这就是一个加速查询的一个东西,使用了全局序数之后可以让数据更紧凑;详细的就不展开了,后面有机会再详细说明一下全局序数,具体的目前可以查看一下官方文档

对于我们本章节内容来说,我们知道父子文档Join类型是使用全局序数来加速查询的就可以了。默认情况下,全局序数基本是实时构建的,当索引发生变化,全局序数会重新构建。这个过程会增加refresh的时间,当然这个配置也是可以关闭的,但是关闭之后会在我们接下来遇到的第一个父连接或者聚合的查询时重新构建全局序数,这样这一部分的时间就反馈给了用户,官方也是不建议我们这样做的,感觉对用户来说不是那么的友好,主要还是在一个权衡。最坏的情况就是同时有多个写入,也就是同时有多个全局序数需要重新构建,也就会造成在单个refresh的时间间隔内要重新构建多个全局序数

当然如果关联字段使用的不是很频繁并且写入事件很多,禁用掉是值得推荐的,禁用方式如下

PUTmy-index-000001

"mappings":{

"properties":{

"join_field":{

"type":"join",

"relations":{

"goods":["details","evaluate"],

"evaluate":"vote"

"eager_global_ordinals":false

}

当然,对于全局序数占用的堆大小情况可以使用如下语句查看

#Per-index

GETmy-index-000001/_stats/fielddatahumanamp;fields=join_field#goods

#Per-nodeper-index

GET_nodes/stats/indices/fielddatahumanamp;fields=join_field#goods

父子文档

首先我们还是创建一个正常的父子关系索引,商品作为父文档,详情作为子文档

DELETEmy-index-000001

PUTmy-index-000001

"mappings":{

"properties":{

"id":{

"type":"keyword"

"join_field":{

"type":"join",

"relations":{

"goods":"details"

}

my-index-000001:索引名称id:文档主键join_field:父子关系字段,type标记为Join为父子文档relations:定义父子关系,goods为父文档类型名称,details为子文档类型名称,后面插入数据,查询都会使用

插入几条测试数据,商品有iphon和mac,详情为颜色外观与内存配置等

PUTmy-index-000001/_doc/1refresh

"id":"1",

"text":"iphone14promax",

"join_field":{

"name":"goods"

PUTmy-index-000001/_doc/2refresh

"id":"2",

"text":"macbookpro",

"join_field":{

"name":"goods"

PUTmy-index-000001/_doc/3routing=1amp;refresh

"id":"3",

"text":"512G16核",

"join_field":{

"name":"details",

"parent":"1"

PUTmy-index-000001/_doc/4routing=1amp;refresh

"id":"4",

"text":"粉/银/黑/抹茶绿",

"join_field":{

"name":"details",

"parent":"1"

PUTmy-index-000001/_doc/5routing=1amp;refresh

"id":"5",

"text":"1T32G",

"join_field":{

"name":"details",

"parent":"2"

PUTmy-index-000001/_doc/6routing=1amp;refresh

"id":"6",

"text":"银/黑",

"join_field":{

"name":"details",

"parent":"2"

}

使用parent_id查询父子文档,以上面插入的测试数据查询,查找mac的详情信息语句如下,前提是知道父文档的id

GETmy-index-000001/_search

"query":{

"parent_id":{

"type":"details",

"id":"2"

"sort":["id"]

}

大部分情况上面是不能满足我们的查询请求的,所以我们还可以使用has_parent或者has_child查询

使用has_parent查询:父文档goods中所有包含macbook的子文档(后文的孙子文档也可以查询)

GETmy-index-000001/_search

"query":{

"has_parent":{

"parent_type":"goods",

"query":{

"match":{

"text":"macbook"

}

使用hash_child查看details子文档中有1T关键字的所有父文档

GETmy-index-000001/_search

"query":{

"has_child":{

"type":"details",

"query":{

"match":{

"text":"1T"

}

使用parent-join查询或者聚合

Elasticsearch在使用Join类型数据类型时,会自动创建一个附加的字段,结构为Join的字段名加#号加父类型,以上文为例,创建一个附加字段(join_field#goods),如下是使用parent-join字段查询聚合的一个例子,参考自官网,应用了8.1版本的新特性运行时字段

GETmy-index-000001/_search

"query":{

"parent_id":{

"type":"details",

"id":"1"

"aggs":{

"parents":{

"terms":{

"field":"join_field#goods",

"size":10

"runtime_mappings":{

"my_parent_field":{

"type":"long",

"script":"""

emit(Integer.parseInt(doc['join_field#goods'].value))

"fields":[

{"field":"my_parent_field"}

}

Join类型的父子文档,上面我们演示了一个父文档对应一种子文档类型的例子,Join类型也支持一个父类型有多个子类型,以上文为基础,加入下面语句测试

DELETEmy-index-000001

PUTmy-index-000001

"mappings":{

"properties":{

"id":{

"type":"keyword"

"join_field":{

"type":"join",

"relations":{

"goods":["details","evaluate"]

PUTmy-index-000001/_doc/7routing=1amp;refresh

"id":"7",

"text":"运行流程,无卡顿,待机时间长",

"join_field":{

"name":"evaluate",

"parent":"1"

PUTmy-index-000001/_doc/8routing=1amp;refresh

"id":"8",

"text":"体重轻,携带方便,编码利器",

"join_field":{

"name":"evaluate",

"parent":"2"

}

同样的,细心的同学已经看到了,上文已经标记了孙子文档,对的,你没看错就是孙子文档,三级的层级,级别可以更深,但是Elasticsearch不建议很深的层次,毕竟Join很消耗性能的,层级再深点没法用了,下面就是多级别的语句测试,此时他们三者的关系就如下所示

DELETEmy-index-000001

PUTmy-index-000001

"mappings":{

"properties":{

"id":{

"type":"keyword"

"join_field":{

"type":"join",

"relations":{

"goods":["details","evaluate"],

"evaluate":"vote"

PUTmy-index-000001/_doc/9routing=1refresh

"id":"9",

"text":"这是投票信息:我买iphone是因为性价比高,保值",

"join_field":{

"name":"vote",

"parent":"1"

PUTmy-index-000001/_doc/10routing=1refresh

"id":"10",

"text":"这是投票信息:我买mac是因为轻,携带方便,没有

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论