• 67.基于nested object实现博客与评论嵌套关系


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

       

    冗余数据方式的来建模,其实用的就是object类型,我们这里又要引入一种新的object类型,nested object类型

       

    博客,评论,做的这种数据模型

       

    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"

    }

    ]

    }

       

    搜索 age=28,name=黄药师的评论,按正常来说应该是搜索不出来的。

       

    GET /website/blogs/_search

    {

    "query": {

    "bool": {

    "must": [

    {"match": {"comments.name": "黄药师"}},

    {"match": {"comments.age": 28}} ]

    }

    }

    }

    搜索结果如下:

    {

    "took": 102,

    "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"

    }

    ]

    }

    }

    ]

    }

    }

       

    结果是把两个评论都搜索出来,和我们预想的不一样,这是什么原因呢?

       

    object类型数据结构在底层的存储方式如下:

       

    {

    "title": [ "花无缺", "发表", "一篇", "帖子" ],

    "content": [ "", "", "花无缺", "大家", "要不要", "考虑", "一下", "投资", "房产", "", "股票", "事情" ],

    "tags": [ "投资", "理财" ],

    "comments.name": [ "小鱼儿", "黄药师" ],

    "comments.comment": [ "什么", "股票", "推荐", "", "喜欢", "投资", "房产", "风险", "收益", "" ],

    "comments.age": [ 28, 31 ],

    "comments.stars": [ 4, 5 ],

    "comments.date": [ 2016-09-01, 2016-10-22 ]

    }

       

    object类型底层数据结构,会将一个json数组中的数据,进行扁平化,所以里面的数据就包含age=28,name=黄药师的数据,所以会返回两条数据作为结果。

    2、引入nested object类型,来解决object类型底层数据结构导致的问题

       

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

    先删除website这个index(delete website),再重新建立mappings

       

    PUT /website

    {

    "mappings": {

    "blogs": {

    "properties": {

    "comments": {

    "type": "nested",

    "properties": {

    "name": { "type": "string" },

    "comment": { "type": "string" },

    "age": { "type": "short" },

    "stars": { "type": "short" },

    "date": { "type": "date" }

    }

    }

    }

    }

    }

    }

    这样建立mappings之后,他的底层实现存储方式就是:

    {

    "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": [ "投资", "理财" ]

    }

       

    再次搜索,发现会得出我们想要的结果。

       

    GET /website/blogs/_search

    {

    "query": {

    "bool": {

    "must": [

    {"match": {"comments.age": 31}},

    {"match": {"comments.name": "黄药师"}} ]

    }

    }

    }

    这样搜索不搜索不出来结果的

       

    GET /website/blogs/_search

    {

    "query": {

    "bool": {

    "must": [

    {

    "match": {

    "title": "花无缺"

    }

    },

    {

    "nested": {

    "path": "comments",

    "score_mode""avg"

    "query": {

    "bool": {

    "must": [

    {

    "match": {

    "comments.name": "黄药师"

    }

    },

    {

    "match": {

    "comments.age": 28

    }

    }

    ]

    }

    }

    }

    }

    ]

    }

    }

    }

       

    score_modemaxminavgnone,默认是avg

       

    如果搜索命中了多个nested document,如何讲个多个nested document的分数合并为一个分数

  • 相关阅读:
    hibernate的获取session的两方法比较,和通过id获取对象的比较,一级缓存二级缓存
    hibernate的几个重要的类和接口
    hibernate框架配置
    c 全局变量
    其他函数-web_concurrent
    其他函数-web_get_int_property
    授权函数-web_set_certificate_ex
    授权函数-web_set_user
    动作函数-web_url
    动作函数-web_submit_data
  • 原文地址:https://www.cnblogs.com/liuqianli/p/8542139.html
Copyright © 2020-2023  润新知