美文网首页elasticsearch玩转大数据大数据 爬虫Python AI Sql
六十一、Elasticsearch数据建模--nested ob

六十一、Elasticsearch数据建模--nested ob

作者: 编程界的小学生 | 来源:发表于2017-07-23 12:54 被阅读100次

    1、先做一个实验,引出来为什么需要nested object

    2、数据准备

    PUT /website/blogs/6
    {
      "title": "花无缺发表的一篇帖子",
      "content":  "我是花无缺,大家要不要考虑一下投资房产和买股票的事情啊。。。",
      "tags":  [ "投资", "理财" ],
      "comments": [ 
        {
          "name":    "小鱼儿",
          "comment": "什么股票啊?推荐一下呗",
          "age":     28,
          "stars":   4,
          "date":    "2016-09-01"
        },
        {
          "name":    "黄药师",
          "comment": "我喜欢投资房产,风,险大收益也大",
          "age":     31,
          "stars":   5,
          "date":    "2016-10-22"
        }
      ]
    }
    

    3、查出年龄是28岁的黄药师评论过的博客

    GET /website/blogs/_search
    {
      "query": {
        "bool": {
          "must": [
            {
              "match": {
                "comments.name": "黄药师"
              }
            },
            {
              "match": {
                "comments.age": "31"
              }
            }
          ]
        }
      }
    }
    

    结果

    {
      "took": 8,
      "timed_out": false,
      "_shards": {
        "total": 5,
        "successful": 5,
        "failed": 0
      },
      "hits": {
        "total": 1,
        "max_score": 1.8022683,
        "hits": [
          {
            "_index": "website",
            "_type": "blogs",
            "_id": "6",
            "_score": 1.8022683,
            "_source": {
              "title": "花无缺发表的一篇帖子",
              "content": "我是花无缺,大家要不要考虑一下投资房产和买股票的事情啊。。。",
              "tags": [
                "投资",
                "理财"
              ],
              "comments": [
                {
                  "name": "小鱼儿",
                  "comment": "什么股票啊?推荐一下呗",
                  "age": 28,
                  "stars": 4,
                  "date": "2016-09-01"
                },
                {
                  "name": "黄药师",
                  "comment": "我喜欢投资房产,风,险大收益也大",
                  "age": 31,
                  "stars": 5,
                  "date": "2016-10-22"
                }
              ]
            }
          }
        ]
      }
    }
    

    确实搜出来了,但是好像结果不太对呢,搜出的结果是黄药师 31岁。。。。。。 我想找28岁的。。。。

    4、分析上述结果

    上述的comments是object类型,object类型在底层存储结构是

    {
      "title":            [ "花无缺", "发表", "一篇", "帖子" ],
      "content":             [ "我", "是", "花无缺", "大家", "要不要", "考虑", "一下", "投资", "房产", "买", "股票", "事情" ],
      "tags":             [ "投资", "理财" ],
      "comments.name":    [ "小鱼儿", "黄药师" ],
      "comments.comment": [ "什么", "股票", "推荐", "我", "喜欢", "投资", "房产", "风险", "收益", "大" ],
      "comments.age":     [ 28, 31 ],
      "comments.stars":   [ 4, 5 ],
      "comments.date":    [ 2016-09-01, 2016-10-22 ]
    }
    

    可以看出document的comments.age是28和31,所以28也命中了。显然不是我们想要的结果,这就引出了nested object类型。

    5、修改mapping,将comments类型从object设置为nested

    DELETE /website
    
    PUT /website
    {
      "mappings": {
        "blogs": {
          "properties": {
            "comments": {
              "type": "nested"
            }
          }
        }
      }
    }
    
    PUT /website/blogs/6
    {
      "title": "花无缺发表的一篇帖子",
      "content":  "我是花无缺,大家要不要考虑一下投资房产和买股票的事情啊。。。",
      "tags":  [ "投资", "理财" ],
      "comments": [ 
        {
          "name":    "小鱼儿",
          "comment": "什么股票啊?推荐一下呗",
          "age":     28,
          "stars":   4,
          "date":    "2016-09-01"
        },
        {
          "name":    "黄药师",
          "comment": "我喜欢投资房产,风,险大收益也大",
          "age":     31,
          "stars":   5,
          "date":    "2016-10-22"
        }
      ]
    }
    

    6、再次搜索

    GET /website/blogs/_search
    {
      "query": {
          "nested": {
            "path": "comments",
            "query": {
              "bool": {
                "must": [
                  {
                    "match": {
                      "comments.name": "黄药师"
                    }
                  },
                  {
                    "match": {
                      "comments.age": 31
                    }
                  }
                ]
              }
            }
          }
        }
    }
    

    知识点:

    nested
    path:nested object类型的field
    

    7、nested object底层数据结构分析

    { 
      "comments.name":    [ "小鱼儿" ],
      "comments.comment": [ "什么", "股票", "推荐" ],
      "comments.age":     [ 28 ],
      "comments.stars":   [ 4 ],
      "comments.date":    [ 2014-09-01 ]
    }
    { 
      "comments.name":    [ "黄药师" ],
      "comments.comment": [ "我", "喜欢", "投资", "房产", "风险", "收益", "大" ],
      "comments.age":     [ 31 ],
      "comments.stars":   [ 5 ],
      "comments.date":    [ 2014-10-22 ]
    }
    { 
      "title":            [ "花无缺", "发表", "一篇", "帖子" ],
      "body":             [ "我", "是", "花无缺", "大家", "要不要", "考虑", "一下", "投资", "房产", "买", "股票", "事情" ],
      "tags":             [ "投资", "理财" ]
    }
    

    若有兴趣,欢迎来加入群,【Java初学者学习交流群】:458430385,此群有Java开发人员、UI设计人员和前端工程师。有问必答,共同探讨学习,一起进步!
    欢迎关注我的微信公众号【Java码农社区】,会定时推送各种干货:


    qrcode_for_gh_577b64e73701_258.jpg

    相关文章

      网友评论

        本文标题:六十一、Elasticsearch数据建模--nested ob

        本文链接:https://www.haomeiwen.com/subject/hnxmkxtx.html