• 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的分数合并为一个分数

  • 相关阅读:
    【Uvalive4960】 Sensor network (苗条树,进化版)
    【UVA 1151】 Buy or Build (有某些特别的东东的最小生成树)
    【UVA 1395】 Slim Span (苗条树)
    【UVA 10600】 ACM Contest and Blackout(最小生成树和次小生成树)
    【UVA 10369】 Arctic Network (最小生成树)
    【UVA 10816】 Travel in Desert (最小瓶颈树+最短路)
    【UVA 11183】 Teen Girl Squad (定根MDST)
    【UVA 11865】 Stream My Contest (二分+MDST最小树形图)
    【UVA 11354】 Bond (最小瓶颈生成树、树上倍增)
    【LA 5713 】 Qin Shi Huang's National Road System (MST)
  • 原文地址:https://www.cnblogs.com/liuqianli/p/8542139.html
Copyright © 2020-2023  润新知