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_mode:max,min,avg,none,默认是avg

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

67.基于nested object实现博客与评论嵌套关系的更多相关文章

  1. 26种基于PHP的开源博客系统

    26种基于PHP的开源博客系统 来源:本站原创 PHP学习笔记 以下列举的PHP开源Blog系统中,除了我们熟知的WordPress之外,大多都没有使用过,其中一些已经被淘汰,或者有人还在使用.除了做 ...

  2. 基于docker搭建wordpress博客网站平台

    WordPress是使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站.也可以把 WordPress当作一个内容管理系统(CMS)来使用. WordPre ...

  3. 【docker构建】基于docker构建wordpress博客网站平台

    WordPress是使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站.也可以把 WordPress当作一个内容管理系统(CMS)来使用. WordPre ...

  4. Mac 上搭建基于 Hexo + GitHub 个人博客

    环境配置 本人电脑系统:macOS Node.js 生成静态页面.安装Node.js Git 用于将本地 Hexo 内容提交到 Github.Xcode自带Git(前提:macOS已经安装了Xcode ...

  5. 基于django的个人博客网站建立(三)

    基于django的个人博客网站建立(三) 前言 网站效果可点击这里访问 今天主要完成的是文章在页面的显示以及评论,留言 具体内容 首先我希望主页面是显示我的所有文章,于是在主页面的视图函数中返回了所有 ...

  6. 基于django的个人博客网站建立(二)

    基于django的个人博客网站建立(二) 前言 网站效果可点击这里访问 今天主要完成后台管理员登录的状态以及关于文章在后台的处理 具体内容 首先接上一次内容,昨天只是完成了一个登录的跳转,其他信息并没 ...

  7. 基于django的个人博客网站建立(一)

    基于django的个人博客网站建立(一) 前言 网站效果可点击这里访问 之前基于hexo和github page搭建过一个博客网页,后来由于换了个系统,感觉弄的有点麻烦也就没有再去管它了,最近偶然从网 ...

  8. 基于django的个人博客网站建立(七)

    基于django的个人博客网站建立(七) 前言 网站效果可点击这里访问 这次在原来的基础上添加或修改一些小功能 具体内容 1.代码高亮 在原来的blog-details.html页面添加下面的代码: ...

  9. 基于django的个人博客网站建立(六)

    基于django的个人博客网站建立(六) 前言 今天主要完成的是项目在腾讯云服务器上ubuntu16.04+django+mysql+uwsig+nginx的部署过程网站效果可点击这里访问 主要内容 ...

随机推荐

  1. CentOS常用基础命令大全

    这篇文章主要介绍了CentOS常用基础命令大全,学习centos的朋友需要掌握的知识,需要的朋友可以参考下 1.关机 (系统的关机.重启以及登出 ) 的命令shutdown -h now 关闭系统(1 ...

  2. 第十一周 Leetcode 576. Out of Boundary Paths (HARD) 计数dp

    Leetcode 576 给定一个二维平面, 一个球在初始位置(i,j)每次可以转移到上下左右的一格. 问在N次转移内,有多少种路径可以转移出边境. dp[i][j][k]为 在点(i,j) 已经走了 ...

  3. RDA UMF进程 & UMF_IR.C 遥控处理

    SIS架构图: SW Structure APP Event Flow :消息分发流程 UMF进程: int umf_main(int argc, char* argv[]) { umf_Init() ...

  4. uva1563

    https://vjudge.net/problem/UVA-1563 高斯消元解同余方程组 就是把原来的除法换成逆元,其他的都一样 #include<bits/stdc++.h> usi ...

  5. Spark 决策树--分类模型

    package Spark_MLlib import org.apache.spark.ml.Pipeline import org.apache.spark.ml.classification.{D ...

  6. 正则表达式:(?=a)是什么意思?

    1.(?=a) 表示我们需要匹配某样东西的前面. 2.(?!a) 表示我们需要不匹配某样东西. 3.(?:a) 表示我们需要匹配某样东西本身. 4.(?<=a) 表示我们需要匹配某样东西的后面. ...

  7. springcloud 向Eureka中注册服务异常java.net.ConnectException: Connection refused: connect

    异常如下: 通过debug发现,服务端的url地址仍然是默认的http://localhost:8761/eureka/apps/,也就是说yml文件中配置没有生效,检查后发现yml中相关配置多写了一 ...

  8. 如何过滤 adb logcat 输出(转载)

    转自:http://www.cnblogs.com/imouto/archive/2012/12/11/filtering-adb-logcat-output.html 简介: 本文介绍如何在 she ...

  9. P2746 [USACO5.3]校园网Network of Schools(Tarjan)

    P2746 [USACO5.3]校园网Network of Schools 题目描述 一些学校连入一个电脑网络.那些学校已订立了协议:每个学校都会给其它的一些学校分发软件(称作“接受学校”).注意即使 ...

  10. react key的作用

    react中的key属性,它是一个特殊的属性,它是出现不是给开发者用的(例如你为一个组件设置key之后不能获取组件的这个key props),而是给react自己用的. 简单来说,react利用key ...