1. 嵌套类型:Nested
nested属于object类型的一种,是Elasticsearch中用于复杂类型对象数组的索引操作。Elasticsearch没有内部对象的概念,因此,ES在存储复杂类型的时候会把对象的复杂层次结果扁平化为一个键值对列表。
比如:
json PUT my-index-000001/_doc/1
{
"group": "fans",
"user": [
{
"first": "John",
"last": "Smith"
},
{
"first": "Alice",
"last": "White"
}
]
}
上面的文档被创建之后,user数组中的每个json对象会以下面的形式存储
{
"group": "fans",
"user.first": [
"alice",
"john"
],
"user.last": [
"smith",
"white"
]
}
user.first和user.last字段被扁平化为多值字段,first和last之间的关联丢失。
使用nested为复杂类型创建mapping:
json PUT <index_name>
{
"mappings": {
"properties": {
"<nested_field_name>": {
"type": "nested"
}
}
}
}
查询:
json GET <index_name>/_search
{
"query": {
"nested": {
"path": "<nested_field_name>",
"query": {
...
}
}
}
}
Optins:
path:nested对象的查询深度
score_mode:评分计算方式
avg (默认):使用所有匹配的子对象的平均相关性得分。
max:使用所有匹配的子对象中的最高相关性得分。
min:使用所有匹配的子对象中最低的相关性得分。
none:不要使用匹配的子对象的相关性分数。该查询为父文档分配得分为0。
sum:将所有匹配的子对象的相关性得分相加。
2. 父子级关系:Join
连接数据类型是一个特殊字段,它在同一索引的文档中创建父/子关系。关系部分在文档中定义了一组可能的关系,每个关系是一个父名和一个子名。父/子关系可以定义如下
json PUT <index_name>
{
"mappings": {
"properties": {
"<join_field_name>": {
"type": "join",
"relations": {
"<parent_name>": "<child_name>"
}
}
}
}
}
使用场景
join类型不能像关系数据库中的表链接那样去用,不论是has_child或者是has_parent查询都会对索引的查询性能有严重的负面影响。并且会触发global ordinals
join唯一合适应用场景是:当索引数据包含一对多的关系,并且其中一个实体的数量远远超过另一个的时候。比如:老师有一万个学生
注意
在索引父子级关系数据的时候必须传入routing参数,即指定把数据存入哪个分片,因为父文档和子文档必须在同一个分片上,因此,在获取、删除或更新子文档时需要提供相同的路由值。
每个索引只允许有一个join类型的字段映射
一个元素可以有多个子元素但只有一个父元素
可以向现有连接字段添加新关系
也可以向现有元素添加子元素,但前提是该元素已经是父元素