首页 > 基础资料 博客日记

elasticsearch中的数据类型:flattened和join

2023-08-16 11:16:59基础资料围观215

文章elasticsearch中的数据类型:flattened和join分享给大家,欢迎收藏Java资料网,专注分享技术知识

flattened:比如你有一个字段的值是一个json,这个json里面又有很多字段,你又不想一个一个的定义这些字段到mapping,就可以用flattened

直接动手:创建索引:

PUT person
{
  "mappings": {
    "properties": {
      "patient_name": {
        "type": "text"
      },
      "detail": {
        "type": "flattened"
      }
    }
  }
}

注意这里details字段类型为flattened, 然后插入文档:

PUT person/_doc/1
{
  "patient_name": "John Doe",
  "detail": {
    "age": 143,
    "skills": [
      "java",
      "python",
      "ai"
    ],
    "history": "none",
    "friends": [
      "Neo",
      "James",
      "Tony Stark"
    ]
  }
}

然后搜索:

GET person/_search
{
  "query": {
    "match": {
      "detail": "java"
    }
  }
}

注意这里直接搜索detail,可以搜索到我们刚刚插入的那个文档,但是我们也可以搜索detail.skills,比如

"detail.skills": "java"

也能搜索到那个文档,但是如果我们这样搜索就搜索不到:

"detail.friends": "java"

还有一点,这里的每个字段会被定义成keyword类型,所以你如果这样搜索就搜索不到:

"detail.friends": "Tony"

你必须完全匹配才能搜索的到:

"detail.friends": "Tony Stark"

 

再来看看join类型,说的是一个索引里面一个文档和其他几个文档有关联,比如几个文档的父文档都是那一个文档,动手:

先创建索引:

PUT person2
{
  "mappings": {
    "properties": {
      "relationship": {
        "type": "join",
        "relations": {
          "star": "fans"
        }
      }
    }
  }
}

这里relationship是一个字段名,类型是join,指的明星和粉丝的关系,所以里面有一个类型的参数relations,它的取值star:fans分别表示父和子的关联类型,后面会用到。

插入文档,首先入场的当然是我们的坤坤:

PUT person2/_doc/1
{
  "name": "August Kun",
  "relationship": {
    "name": "star"
  }
}

这里的relationship.name是star,这个值是在前面mapping里面定义的,前面提到过,如果你写个super_star,就会报错:

unknown join name [doctor2] for field [relationship]

 

然后来个小黑子:

PUT person2/_doc/2?routing=tony
{
 "name":"小黑子",
 "relationship":{
 "name":"fans",
 "parent":1
 }
}

注意这里有个routing参数,如果插入子文档的时候没有指定routing是会报错的,这是为了将相关的文档分配到相同的分片,比如后面插入第二个子文档真爱粉的时候也指定相同的路由参数值。

[routing] is missing for join field [relationship]

还有这里的relationship.name是fans,也是在前面mapping里面定义的。

指定parent是1,就确定了父子文档的关系。

最后就是真爱粉了,插入第二个子文档:

PUT person2/_doc/3?routing=tony
{
 "name":"爱坤",
 "relationship":{
 "name":"fans",
 "parent":1
 }
}

路由参数一样,下面查询:

GET person2/_search
{
  "query": {
    "parent_id": {
      "type": "fans",
      "id": 1
    }
  }
}

可以查到两个子文档,两个粉丝,但是不包括父文档坤坤:

    "hits" : [
      {
        ..."_routing" : "tony",
        "_source" : {
          "name" : "小黑子",
          "relationship" : {
            "name" : "fans",
            "parent" : 1
          }
        }
      },
      {
        ..."_routing" : "tony",
        "_source" : {
          "name" : "爱坤",
          "relationship" : {
            "name" : "fans",
            "parent" : 1
          }
        }
      }

如果插入第二个子文档的时候指定路由参数是neo,也可以搜索到两个子文档,不影响搜索,但不建议这样做。

PUT person2/_doc/3?routing=neo

还有要注意的是如果查询的时候,指定parent_id.type为star会报错:
GET person2/_search
{
  "query": {
    "parent_id": {
      "type": "star",
      "id": 1
    }
  }
}

报错如下:

[parent_id] no relation found for child [star]

也就是说这里要指定的是子文档的关联类型

 

 

 
 

文章来源:https://www.cnblogs.com/gong2021/p/17633547.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!

标签:

相关文章

本站推荐

标签云