PostgreSQL和ElasticSearch学习笔记

Posted sereasuesue

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PostgreSQL和ElasticSearch学习笔记相关的知识,希望对你有一定的参考价值。

PG库

PostgreSQL 12.2 手册

pg数据库的结构理解 - echao - 博客园 (cnblogs.com)

PostgreSQL官方介绍称是最先进的开源关系型数据库,支持所有主流的平台,目前已经更新到了最新版本的12.0,在mysql被Oracle收购后,PostgreSQL开源社区越来越活跃了,同时还有分布式集群的开源方案GreenPlum,目前也非常受欢迎。

pg数据库和mysql的区别是什么

pg数据库和mysql的区别是什么?-mysql教程-PHP中文网

MySQL与PostgreSQL都能运行在多个操作系统上,如Linux、Unix、Mac OS X与Windows。他们都是开源、免费的,因此测试他们时的唯一代价就是你的时间与硬件。他们都很灵活且具有可伸缩性,可用在小型系统和大型分布式系统 上。MySQL在一个领域上要比PostgreSQL更进一步,那就是它的触角延伸到了嵌入式领域,这是通过libmysqld实现的。 PostgreSQL不支持嵌入式应用,依然坚守在传统的客户端/服务器架构上。

MySQL通常被认为是针对网站与应用的快速数据库后端,能够进行快速的读取和大量的查询操作,不过在复杂特性与数据完整性检查方面不太尽如人意。

PostgreSQL是针对事务型企业应用的严肃、功能完善的数据库,支持强ACID特性和很多数据完整性检查。他们二者都在某些任务上具有很快的速 度,MySQL不同存储引擎的行为有较大差别。MyISAM引擎是最快的,因为它只执行很少的数据完整性检查,适合于后端读操作较多的站点,不过对于包含 敏感数据的读/写数据库来说就是个灾难了,因为MyISAM表最终可能会损坏。MySQL提供了修复MySQL表的工具,不过对于敏感数据来说,支持 ACID特性的InnoDB则是个更好的选择。

与之相反,PostgreSQL则是个只有单一存储引擎的完全集成的数据库。你可以通过调整postgresql.conf文件的参数来改进性能,也可以调整查询与事务。PostgreSQL文档对于性能调优提供了非常详尽的介绍。

MySQL与PostgreSQL都是高可配置的,并且可以针对不同的任务进行相应的优化。他们都支持通过扩展来添加额外的功能。

一. 后台登录

\\1. 首先切换至master用户

# su master

\\2. 登录PG库,数据库名称为nsc

$ psql -U nsc

\\3. 展示当前数据库下所有schema信息

nsc=> \\dn

\\4. 常见命令

\\password      设置密码
​
\\q          退出
​
\\h          查看SQL命令的解释,比如\\h select
​
\\?          查看psql命令列表
​
\\l          列出所有数据库
​
\\c [database_name]  连接其他数据库
​
\\d          列出当前数据库的所有表格
​
\\d [table_name]   列出某一张表格的结构
​
\\x          对数据做展开操作
​
\\du         列出所有用户

table命令和sql一样

ElasticSearch

下载地址

ElasticSearch: https://mirrors.huaweicloud.com/elasticsearch/?C=N&O=D

logstash: https://mirrors.huaweicloud.com/logstash/?C=N&O=D

可视化界面elasticsearch-head.https://github.com/mobz/elasticsearch-head

kibana: https://mirrors.huaweicloud.com/kibana/?C=N&O=D

ik分词器 https://github.com/medcl/elasticsearch-analysis-ik

jdk必须是1.8及以上的版本


概述

ElasticSearch,简称es,es是一个开源的高拓展的分布式全文检索引擎,它可以近乎实施的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。es也使用java开发并使用Lucene 作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。

lucene 信息检索工具包 不包含搜索引擎系统

Elasticsearch和lucene 是基于lucene做了一些封装和增强

是什么 The Elastic Stack, 包括Elasticsearch 、 Kibana、 Beats 和 Logstash(也称为 ELK Stack)。能够安全可靠地获取任何来源、任何格式的数据,然后实时地对数据进行搜索、分析和可视化。

谁在使用

  • 维基百科,类似百度百科,全文检索,高亮,搜索推荐

  • 国外新闻网站,类似搜狐新闻,用户行为日志(点击,浏览,收藏,评论)+社交网络数据,数据分析。。。

  • Stack Overflow国外的程序异常讨论论坛

  • GitHub(开源代码管理),搜索上千亿行代码

  • 电商网站,检索商品

  • 日志数据分析,logstash采集日志,ES进行复杂的数据分析,ELK技术(elasticsearch+logstash+kibana)

  • 商品价格监控网站

  • 商业智能系统

  • 站内搜索

ES和solr的差别

ElasticSearch简介

ElasticSearch是一个实施分布式搜索分析引擎。它让你以前所未有的速度处理大数据成为可能。它用于全文搜索、结构化搜索、分析以及将这三者混合使用:

维基百科使用es提供全文搜索并高亮关键字,以及输入实施搜索和搜索纠错等搜索建议功能;英国公报使用es结合用户日志和社交网络数据提供给他们的编辑以实施的反馈

es是一个基于Apache Lucene(TM)的开源搜索引擎。无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好、功能最全的搜索引擎库。想要使用它,必须使用java来作为开发语言并将其直接继承到你的应用中。

solr简介

Solr是Apache下的一个顶级开源项目,采用java开发,是基于Lucene的全文搜索服务器。Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展、并对索引、搜索性能进行了优化。可以独立运行,是一个独立的企业及搜索应用服务器,它对外提供类似于web-service的API接口。用户可以通过http请求,像搜索引擎服务器提交一定格式的文件,生成索引;也可以通过提出查找请求,并得到返回结果。

两者比较

  • 当单纯的对已有数据进行搜索时,Solr更快

  • 实时建立索引是,Solr会产生io阻塞,查询性能较差,ElasticSearch具有明显的优势

  • 随着数据量的增加,Solr的搜索效率会变得更低,而Elasticsearch却没有明显的变化

总结

  1. es基本是开箱即用,非常简单。而solr会有点复杂。

  2. Solr利用Zookeeper进行分布式管理,而elasticsearch自身带有分布式协调管理功能

  3. solr支持更多格式的数据,比如json xml csv。而es只支持json文件格式

  4. solr官方提供的功能更多,而elasticsearch更注重核心功能,高级功能由第三方插件提供

  5. solr查询快,但更新索引时慢,用于电商等查询多的应用

  6. es建立索引宽,即实时性查询快,用于facebook新浪等搜索

  7. solr较成熟,有一个更大,更成熟的用户、开发和贡献者社区,而elasticsearch相对开发维护者较少,更新太快,学习使用成本较高

ElasticSearch安装

注:安装ElasticSearch之前必须保证JDK1.8+安装完毕,并正确的配置好JDK环境变量,否则启动ElasticSearch失败。

官方文档

Elasticsearch 7.8.0下载页面

Windows 版的 Elasticsearch 压缩包,解压即安装完毕,解压后的 Elasticsearch 的目录结构如下 :

目录含义
bin可执行脚本目录
config配置目录
jdk内置jdk目录
lib logs类库 日志目录
modules模块目录
plugins插件目录

解压后,进入 bin 文件目录,点击 elasticsearch.bat 文件启动 ES 服务 。

注意: 9300 端口为 Elasticsearch 集群间组件的通信端口, 9200 端口为浏览器访问的 http协议 RESTful 端口。

打开浏览器,输入地址: http://localhost:9200,测试返回结果,返回结果如下:

{
  "name" : "DESKTOP-R91PIL1",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "HeSR3Kd_T5ucRm3oEsO1cA",
  "version" : {
    "number" : "7.13.2",
    "build_flavor" : "default",
    "build_type" : "zip",
    "build_hash" : "4d960a0733be83dd2543ca018aa4ddc42e956800",
    "build_date" : "2021-06-10T21:01:55.251515791Z",
    "build_snapshot" : false,
    "lucene_version" : "8.8.2",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

参考链接:https://blog.csdn.net/u011863024/article/details/115721328

可视化界面

cerebro postman head 谷歌浏览器插件等

ES核心概念

ElasticSearch是面向文档型的数据库,一条数据在这里就是一个文档。比如:

{
    "name" :     "John",
    "sex" :      "Male",
    "age" :      25,
    "birthDate": "1990/05/01",
    "about" :    "I love to go rock climbing",
    "interests": [ "sports", "music" ]
}

在MySql中这样的数据存储容易想到建立一张User表,其中有一些字段,而在es中就是一个文档,文档会属于一个User类型,各种各样的类型存储于一个索引中。下表是关系型数据库和es的疏于对照表:

关系型数据库(比如Mysql)非关系型数据库(Elasticsearch)
数据库Database索引Index
表Table类型Type
数据行Row文档Document
数据列Column字段Field
约束 Schema映射Mapping

集群,节点,索引,类型,文档,分片,映射是什么?

es中可以包含多个索引(数据库),每个索引中可以包含多个类型(表),每个类型下又包含多个文档(行),每个文档又包含多个字段(列)。

物理设计:

es在后台把每个索引划分成多个分片,每个分片可以在集群中的不同服务器中转移。

逻辑设计:

一个索引类型,包含多个文档,当我们索引一篇文档时,可以通过这样的顺序找到他: 索引-》类型-》文档id(该id实际是个字符串),通过这个组合我们就能索引到某个具体的文档。

文档

es是面向文档的,意味着索引和搜索数据的最小单位是文档,es中,文档有几个重要的属性:

  • 自我包含,一篇文档同时包含字段和对应的值,也就是同时包含key:value

  • 可以是层次性的,一个文档中包含自文档,复杂的逻辑实体就是这么来的

  • 灵活的结构,文档不依赖预先定义的模式,我们知道关系型数据库中,要提前定义字段才能使用,在es中,对于字段是非常灵活的。有时候,我们可以忽略字段,或者动态的添加一个新的字段

尽管我们可以随意的添加或忽略某个字段,但是,每个字段的类型非常重要。因为es会保存字段和类型之间的映射以及其他的设置。这种映射具体到每个映射的每种类型,这也是为什么在es中,类型有时候也称为映射类型。

类型

类型是文档的逻辑容器,就像关系型数据库一样,表格是行的容器。类型中对于字段的定义称为映射,比如name映射为string类型.我们说文档是无模式的,他们不需要拥有映射中所定义的所有字段,当新增加一个字段时,es会自动的将新字段加入映射,但是这个字段不确定他是什么类型,所以最安全的方式是提前定义好所需要的映射。

索引

就是数据库

索引是映射类型的容器,es的索引是一个非常大的集合。索引寻出了映射类型的字段和其他设置。然后他们被存储到了各个分片上。

物理设计:节点和分片工作

一个集群至少有一个节点,而一个节点就是一个es进程,节点可以有多个索引默认的,如果创建索引,索引会

倒排索引

elasticsearch使用的是一种称为倒排索引的结构,采用Lucene倒排索作为底层。这种结构适用于快速的全文搜索,一个索引文档中所有不重复的列表构成,对于每一个词,都有一个包含它的文档列表。例如,现在有两个文档,每个文档包含如下内容∶

Study every day,good good up to forever # 文档1包含的内容
To forever, study every day, good good up # 文档2包含的内容

为了创建倒排索引,我们首先要将每个文档拆分成独立的词(或称为词条或者tokens),然后创建一个包含所有不重复的词条的排序列表,然后列出每个词条出现在哪个文档:

img

现在,我们试图搜索to forever,只需要查看包含每个词条的文档

image-20210202134535705

两个文档都匹配,但是第一个文档比第二个匹配程度更高。如果没有别的条件,现在,这两个包含关键字的文档都将返回。再来看一个示例,比如我们通过博客标签来搜索博客文章。那么倒排索引列表就是这样的一个结构:

如果要搜索含有python标签的文章,那相对于查找所有原始数据而言,查找倒排索引后的数据将会快的多。只需要查看标签这一栏,然后获取相关的文章ID即可。完全过滤掉无关的所有数据,提高效率!

elasticsearch的索引和Lucene的索引对比

在elasticsearch中,索引(库)这个词被频繁使用,这就是术语的使用。在elasticsearch中,索引被分为多个分片,每份分片是一个Lucene的索引。所以一个elasticsearch索引是由多个Lucene索引组成的。别问为什么,谁让elasticsearch使用Lucene作为底层呢!如无特指,说起索引都是指elasticsearch的索引。

命令模式的使用

Rest风格说明

一种软件架构风格,而不是标准。更易于实现缓存等机制

methodurl地址描述
POSTlocalhost:9200/索引名称/类型名称创建文档(随机文档id)
POSTlocalhost:9200/索引名称/类型名称/文档id/_update修改文档
DELETElocalhost:9200/索引名称/类型名称/文档id 删除文档删除文档
GETlocalhost:9200/索引名称/类型名称/文档id通过文档id查询文档
POSTlocalhost:9200/索引名称/类型名称/_search查询所有的数据

学习资料:https://blog.csdn.net/lisen01070107/article/details/108288037有下载镜像

https://zhuanlan.zhihu.com/p/268065286

【狂神说Java】ElasticSearch7.6.x最新完整教程通俗易懂哔哩哔哩bilibili

https://www.bilibili.com/video/BV1hh411D7sb

Elasticsearch学习笔记_KISS-CSDN博客

(狂神)ElasticSearch 7.x.x学习笔记_愿你拥有大风与烈酒,也能享受孤独与自由-CSDN博客

以上是关于PostgreSQL和ElasticSearch学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch与Postgresql大数据检索性能对比

PostgreSQL PostGIS 与 ElasticSearch 空间搜索

elasticsearch ngram 和 postgresql trigram 搜索结果不匹配

将PostgreSQL数据库的表导入到elasticsearch中

从 PostgreSQL 到 Elasticsearch 的索引数据

PostgreSQL(全文搜索)与 ElasticSearch