前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ES中nest join

ES中nest join

作者头像
付威
发布2020-01-21 17:17:00
7850
发布2020-01-21 17:17:00
举报

nested 类型是一个特殊object数据类型,允许数组的object的字段可以被独立的查询出来。

数据类型是如何被封装的

在lucene中没有嵌套object的概念,所以ES的用一个简单的数据数据列表来表示一个复杂的层次数据实体,例如一个博客和评论的实体:

代码语言:javascript
复制
PUT  nesttest/_doc
{
    "blog_title": "开篇-es的nest的使用",
    "blog_content": "从本篇文章开始,我会分享给大家canvas绘制的各种基础图形和酷炫的图形",
    "tags": [
        "Java",
        "es"
    ],
    "hit_count": 5,
    "commet": [
        {
            "commet_user": "tom",
            "commet_content": "good Job",
            "commet_time": "2019-02-26",
             "commet_location": "beijing"
        },
        {
            "commet_user": "john",
            "commet_content": "clearly,tks",
            "commet_time": "2019-02-23"
            ,
             "commet_location": "shanghai"
        },
        {
            "commet_user": "lily",
            "commet_content": "it's too hard ",
            "commet_time": "2019-02-22"
           ,
             "commet_location": "shenzhen"
        }
    ],
    "create_time": "2019-02-26"
}

其中commet类型会被转化成一个数组的形式如下:

代码语言:javascript
复制
{
  ... 
  "commet.commet_user":["tom","john","lily"],
  ...
   "commet.commet_location":["beijing","shanghai","shenzhen"],
}

而当执行查询的时候:

代码语言:javascript
复制
GET nesttest/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "commet.commet_user": "john" }},
        { "match": { "commet.commet_location":  "shenzhen" }}
      ]
    }
  }
}

发现查询结果如下:

代码语言:javascript
复制
{
...
 
    "hits" : [
      {
        "_index" : "nest",
        "_type" : "_doc",
        "_id" : "pe0iKWkBulkJdQfMSgyV",
        "_score" : 0.5753642,
        "_source" : {
          "blog_title" : "2019-01-05",
          "blog_content" : "从本篇文章开始,我会分享给大家canvas绘制的各种基础图形和酷炫的图形",
          "tags" : [
            "Java",
            "es"
          ],
          "hit_count" : 5,
          "commet" : [
            {
              "commet_user" : "tom",
              "commet_content" : "good Job",
              "commet_time" : "2019-02-26",
              "commet_location" : "beijing"
            },
            {
              "commet_user" : "john",
              "commet_content" : "clearly,tks",
              "commet_time" : "2019-02-23",
              "commet_location" : "shanghai"
            },
            {
              "commet_user" : "lily",
              "commet_content" : "it's too hard ",
              "commet_time" : "2019-02-22",
              "commet_location" : "shenzhen"
            }
          ],
          "create_time" : "2019-02-26"
        }
      }
    ]
  }
}  

上面把所有的结果都列出来了, 但是 john的不在shenzhen啊?所以需要把commet定义为nested 类型。

定义nested类型
代码语言:javascript
复制
PUT nest_new/_mapping/_doc
{
    "properties": {
        "blog_title": {
            "type": "text"
        },
        "blog_content": {
            "type": "text"
        },
        "tags": {
            "type": "keyword"
        },
        "hit_count": {
            "type": "keyword"
        },
        "commet": {
            "type": "nested",//这里
            "properties": {
                "commet_user": {
                    "type": "text"
                },
                "commet_content": {
                    "type": "text"
                },
                "commet_time": {
                    "type": "date"
                },
                "commet_location": {
                    "type": "keyword"
                }
            }
        },
        "create_time": {
            "type": "date"
        },
        "datachange_lasttime": {
            "format": "strict_date_optional_time||epoch_millis",
            "type": "date"
        }
    }
}

ES嵌套深度被限制在50层

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-02-25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 数据类型是如何被封装的
  • 定义nested类型
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档