白话Elasticsearch54-数据建模之通过【应用层join】或者【数据冗余】实现实现用户与博客的关联

本文涉及的产品
Elasticsearch Serverless通用抵扣包,测试体验金 200元
简介: 白话Elasticsearch54-数据建模之通过【应用层join】或者【数据冗余】实现实现用户与博客的关联

20190806092132811.jpg

概述

继续跟中华石杉老师学习ES,第54篇

课程地址https://www.roncoo.com/view/55


关系型与document类型数据模型对比

举个例子: 部门和员工 ,1个部门下可以有N多个员工 ,部门:员工 = 1:N 1对多的关系。


关系型数据库

部门Department 表

dept_id  name  desc

员工Employee 表 (通过dept_id关联到所属的部门)

emp_id name age gender  dept_id


数据库的设计还是遵循了三范式:将每个数据实体拆分为一个独立的数据表,同时使用主外键关联关系将多个数据表关联起来 , 确保没有任何冗余的数据 .


一份数据,只会放在一个数据表中,比如dept name,部门名称,就只会放在department表中,不会在employee表中也放一个dept name,如果说你要查看某个员工的部门名称,那么必须通过员工表中的外键,dept_id,找到在部门表中对应的记录,然后找到部门名称 。


应用Model

/**
* 部门
**/
public class Department {
  private Integer deptId;
  private String name;
  private String desc;
  // 部门中存放一个 员工的集合 
  private List<Employee> employees;
}
/**
* 员工
**/
public class Employee {
  private Integer empId;
  private String name;
  private Integer age;
  private String gender;
  // 所在部门
  private Department dept;
}


es文档数据模型

{
  "deptId": "1",
  "name": "研发部门",
  "desc": "负责公司的所有研发项目",
  "employees": [
    {
      "empId": "1",
      "name": "张三",
      "age": 28,
      "gender": "男"
    },
    {
      "empId": "2",
      "name": "王兰",
      "age": 25,
      "gender": "女"
    },
    {
      "empId": "3",
      "name": "李四",
      "age": 34,
      "gender": "男"
    }
  ]
}


es更加类似于面向对象的数据模型,将所有由关联关系的数据,放在一个doc json类型数据中,整个数据的关系,还有完整的数据,都放在了一起.


建模方式一:通过应用层join实现用户与博客的关联


构造用户与博客数据


# 让ES自动创建 users索引,并写入一条数据
PUT /users/users/1 
{
  "name":     "小工匠",
  "email":    "artisan@artisan.com",
  "birthday":      "2000-01-01"
}
#让ES自动创建 blogs ,并写入一条数据
PUT /blogs/blogs/1
{
  "title":    "跟石杉老师学ES",
  "content":     "数据建模之通过【应用层join】或者【数据冗余】实现实现用户与博客的关联",
  "userId":     1 
}

搜索某个用户发表的所有博客

# 第一次搜索  查询name为 小工匠的用户 (这里需要name.keyword 不分词查询)
GET /users/users/_search
{
  "query": {
    "term": {
      "name.keyword": {
        "value": "小工匠"
      }
    }
  }
}


2019083111171010.png

# 第二次搜索,要放入terms中userId
GET /blogs/blogs/_search
{
  "query": {
    "bool": {
      "filter": {
        "terms": {
          "userId": [
            1
          ]
        }
      }
    }
  }
}


2019083111175238.png


假设搜索的是,1万个用户的博客,可能第一次搜索,会得到1万个userId , 第二次搜索的时候,要放入terms中1万个userId,才能进行搜索,这个时候性能比较差了 。


优缺点

  • 优点:数据不冗余,维护方便
  • 缺点:应用层join,如果关联数据过多,导致查询过大,性能很差


建模方式二:通过数据冗余实现用户与博客的关联


第二种建模方式:用冗余数据,采用文档数据模型,进行数据建模,实现用户和博客的关联, 在ES的应用中,推荐这种方式建模。


构造用户与博客数据

# 让ES自动创建 users2索引,并写入一条数据
PUT /users2/users2/1
{
  "name": "小工匠",
  "email": "artisan@artisan.com",
  "birthday": "2000-01-01"
}
#让ES自动创建 blogs2 ,并写入一条数据
PUT /blogs2/blogs2/1
{
  "title": "跟石杉老师学ES",
  "content": "数据建模之通过【应用层join】或者【数据冗余】实现实现用户与博客的关联",
  "userInfo": {
    "userId": 1,
    "username": "小工匠"
  }
}


冗余数据就是说将可能会进行搜索的条件和要搜索的数据,放在一个doc中


搜索某个用户发表的所有博客

GET /blogs2/blogs2/_search 
{
  "query": {
    "term": {
      "userInfo.username.keyword": {
        "value": "小工匠"
      }
    }
  }
}

201908311126373.png

可以看到不需要走应用层的join,先搜一个数据,找到id,再去搜另一份数据,直接走一个有冗余数据的type即可,指定要的搜索条件,即可搜索出自己想要的数据来。


优点和缺点


  • 优点:性能高,不需要执行两次搜索
  • 缺点:数据冗余,维护成本高 ,每次username变化了,同时要更新user type和blog type


一般来说,对于es这种NoSQL类型的数据存储来讲,都是冗余模式…


当然,我们要去维护数据的关联关系,也是很有必要的,所以一旦出现冗余数据的修改,必须记得将所有关联的数据全部更新。

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。 &nbsp;
相关文章
|
数据库 索引
elasticsearch中join类型数据如何进行父子文档查询?
elasticsearch中join类型数据如何进行父子文档查询?
|
存储 搜索推荐 数据建模
Elasticsearch 的数据建模与索引设计
【9月更文第3天】Elasticsearch 是一个基于 Lucene 的搜索引擎,广泛应用于全文检索、数据分析等领域。为了确保 Elasticsearch 的高效运行,合理的数据建模和索引设计至关重要。本文将探讨如何为不同的应用场景设计高效的索引结构,并分享一些数据建模的最佳实践。
539 2
|
存储 索引
Elasticsearch中父子文档的关联:利用Join类型赋予文档的层级关系
Elasticsearch中父子文档的关联:利用Join类型赋予文档的层级关系
|
数据建模 关系型数据库
Elasticsearch之数据建模实战通过应用层join实现用户与博客的关联
Elasticsearch之数据建模实战通过应用层join实现用户与博客的关联
204 0
|
存储 JSON 数据建模
Elasticsearch数据建模实战之基于nested object实现博客与评论嵌套关系
Elasticsearch数据建模实战之基于nested object实现博客与评论嵌套关系
178 0
|
数据建模
Elasticsearch数据建模实战之祖孙三层数据关系建模以及搜索实战
Elasticsearch数据建模实战之祖孙三层数据关系建模以及搜索实战
129 0
|
数据建模
Elasticsearch数据建模实战之对文件系统进行数据建模以及文件搜索实战
Elasticsearch数据建模实战之对文件系统进行数据建模以及文件搜索实战
115 0
|
数据建模 关系型数据库
白话Elasticsearch60-数据建模实战_Join datatype 父子关系数据建模
白话Elasticsearch60-数据建模实战_Join datatype 父子关系数据建模
206 0
|
8月前
|
安全 Java Linux
Linux安装Elasticsearch详细教程
Linux安装Elasticsearch详细教程
1374 64
|
7月前
|
JSON 安全 数据可视化
Elasticsearch(es)在Windows系统上的安装与部署(含Kibana)
Kibana 是 Elastic Stack(原 ELK Stack)中的核心数据可视化工具,主要与 Elasticsearch 配合使用,提供强大的数据探索、分析和展示功能。elasticsearch安装在windows上一般是zip文件,解压到对应目录。文件,elasticsearch8.x以上版本是自动开启安全认证的。kibana安装在windows上一般是zip文件,解压到对应目录。elasticsearch的默认端口是9200,访问。默认用户是elastic,密码需要重置。
3370 0