联接字段类型
1.0 版引入
联接字段类型用于在同一索引中的文档之间建立父/子关系。
示例
创建映射以在产品及其品牌之间建立父/子关系
PUT testindex1
{
"mappings": {
"properties": {
"product_to_brand": {
"type": "join",
"relations": {
"brand": "product"
}
}
}
}
}
然后,使用联接字段类型索引一个父文档
PUT testindex1/_doc/1
{
"name": "Brand 1",
"product_to_brand": {
"name": "brand"
}
}
您也可以使用不带对象表示法的快捷方式来索引父文档
PUT testindex1/_doc/1
{
"name": "Brand 1",
"product_to_brand" : "brand"
}
索引子文档时,您需要指定 routing
查询参数,因为同一父/子层级中的父文档和子文档必须索引在同一分片上。更多信息请参见路由。每个子文档在其 parent
字段中引用其父文档的 ID。
索引两个子文档,每个父文档对应一个
PUT testindex1/_doc/3?routing=1
{
"name": "Product 1",
"product_to_brand": {
"name": "product",
"parent": "1"
}
}
PUT testindex1/_doc/4?routing=1
{
"name": "Product 2",
"product_to_brand": {
"name": "product",
"parent": "1"
}
}
查询联接字段
当您查询联接字段时,响应会包含指定返回文档是父文档还是子文档的子字段。对于子对象,还会返回父 ID。
搜索所有文档
GET testindex1/_search
{
"query": {
"match_all": {}
}
}
响应指示文档是父文档还是子文档
{
"took" : 4,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 3,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "testindex1",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"name" : "Brand 1",
"product_to_brand" : {
"name" : "brand"
}
}
},
{
"_index" : "testindex1",
"_type" : "_doc",
"_id" : "3",
"_score" : 1.0,
"_routing" : "1",
"_source" : {
"name" : "Product 1",
"product_to_brand" : {
"name" : "product",
"parent" : "1"
}
}
},
{
"_index" : "testindex1",
"_type" : "_doc",
"_id" : "4",
"_score" : 1.0,
"_routing" : "1",
"_source" : {
"name" : "Product 2",
"product_to_brand" : {
"name" : "product",
"parent" : "1"
}
}
}
]
}
}
搜索父文档的所有子文档
查找与品牌 1 相关联的所有产品
GET testindex1/_search
{
"query" : {
"has_parent": {
"parent_type":"brand",
"query": {
"match" : {
"name": "Brand 1"
}
}
}
}
}
响应包含与品牌 1 相关联的产品 1 和产品 2
{
"took" : 7,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "testindex1",
"_type" : "_doc",
"_id" : "3",
"_score" : 1.0,
"_routing" : "1",
"_source" : {
"name" : "Product 1",
"product_to_brand" : {
"name" : "product",
"parent" : "1"
}
}
},
{
"_index" : "testindex1",
"_type" : "_doc",
"_id" : "4",
"_score" : 1.0,
"_routing" : "1",
"_source" : {
"name" : "Product 2",
"product_to_brand" : {
"name" : "product",
"parent" : "1"
}
}
}
]
}
}
搜索子文档的父文档
查找产品 1 的父文档
GET testindex1/_search
{
"query" : {
"has_child": {
"type":"product",
"query": {
"match" : {
"name": "Product 1"
}
}
}
}
}
响应返回品牌 1 作为产品 1 的父文档
{
"took" : 4,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "testindex1",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"name" : "Brand 1",
"product_to_brand" : {
"name" : "brand"
}
}
}
]
}
}
一父多子
一个父文档可以有多个子文档。创建一个包含多个子文档的映射
PUT testindex1
{
"mappings": {
"properties": {
"parent_to_child": {
"type": "join",
"relations": {
"parent": ["child 1", "child 2"]
}
}
}
}
}
联接字段类型注意事项
- 一个索引中只能有一个联接字段映射。
- 检索、更新或删除子文档时,您需要提供路由参数。这是因为同一关系中的父文档和子文档必须索引在同一分片上。
- 不支持多个父文档。
- 您只能在现有文档已被标记为父文档的情况下,向其添加子文档。
- 您可以向现有联接字段添加新关系。