PostgreSQL和ElasticSearch学习笔记
Posted sereasuesue
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PostgreSQL和ElasticSearch学习笔记相关的知识,希望对你有一定的参考价值。
PG库
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却没有明显的变化
总结
-
es基本是开箱即用,非常简单。而solr会有点复杂。
-
Solr利用Zookeeper进行分布式管理,而elasticsearch自身带有分布式协调管理功能
-
solr支持更多格式的数据,比如json xml csv。而es只支持json文件格式
-
solr官方提供的功能更多,而elasticsearch更注重核心功能,高级功能由第三方插件提供
-
solr查询快,但更新索引时慢,用于电商等查询多的应用
-
es建立索引宽,即实时性查询快,用于facebook新浪等搜索
-
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),然后创建一个包含所有不重复的词条的排序列表,然后列出每个词条出现在哪个文档:
现在,我们试图搜索to forever,只需要查看包含每个词条的文档
两个文档都匹配,但是第一个文档比第二个匹配程度更高。如果没有别的条件,现在,这两个包含关键字的文档都将返回。再来看一个示例,比如我们通过博客标签来搜索博客文章。那么倒排索引列表就是这样的一个结构:
如果要搜索含有python标签的文章,那相对于查找所有原始数据而言,查找倒排索引后的数据将会快的多。只需要查看标签这一栏,然后获取相关的文章ID即可。完全过滤掉无关的所有数据,提高效率!
elasticsearch的索引和Lucene的索引对比
在elasticsearch中,索引(库)这个词被频繁使用,这就是术语的使用。在elasticsearch中,索引被分为多个分片,每份分片是一个Lucene的索引。所以一个elasticsearch索引是由多个Lucene索引组成的。别问为什么,谁让elasticsearch使用Lucene作为底层呢!如无特指,说起索引都是指elasticsearch的索引。
命令模式的使用
Rest风格说明
一种软件架构风格,而不是标准。更易于实现缓存等机制
method | url地址 | 描述 |
---|---|---|
POST | localhost:9200/索引名称/类型名称 | 创建文档(随机文档id) |
POST | localhost:9200/索引名称/类型名称/文档id/_update | 修改文档 |
DELETE | localhost:9200/索引名称/类型名称/文档id 删除文档 | 删除文档 |
GET | localhost:9200/索引名称/类型名称/文档id | 通过文档id查询文档 |
POST | localhost:9200/索引名称/类型名称/_search | 查询所有的数据 |
学习资料:https://blog.csdn.net/lisen01070107/article/details/108288037有下载镜像
https://zhuanlan.zhihu.com/p/268065286
【狂神说Java】ElasticSearch7.6.x最新完整教程通俗易懂哔哩哔哩bilibili
以上是关于PostgreSQL和ElasticSearch学习笔记的主要内容,如果未能解决你的问题,请参考以下文章
Elasticsearch与Postgresql大数据检索性能对比
PostgreSQL PostGIS 与 ElasticSearch 空间搜索
elasticsearch ngram 和 postgresql trigram 搜索结果不匹配
将PostgreSQL数据库的表导入到elasticsearch中