背景
现在各个网站及博客的教程都是6.x的教程。最近公司有项目需要用到elasticsearch技术,然后就看看了一些教程和文档,对比了一下6.x与7.x的区别,发现区别还是挺大的,最终决定采用7.x的版本。然后将这个过程记录下来,同时也是方便他人可以看到最新的elasticsearch 7.x的一些资料。
那么提起Elasticsearch就会联想到一个人,Hadoop之父Doug Cutting,1997年底,迷上了搜索引擎,他做了一个文本搜索的函数库,命名Lucene。作为第一个提供全文文本搜索的开源函数库,Lucene的伟大自不必多言。之后,Cutting再接再厉,在 Lucene的基础上将开源的思想继续深化。2004年Doug Cutting在Lucene基础上和Apache开源伙伴Mike Cafarella决定开发一款可以代替当时的主流搜索产品的开源搜索引擎,这个项目被命名为Nutch。
随着时间的推移,无论是Google还是Nutch都面临着搜索"体积"不断增大的问题,尤其是Google,作为互联网搜索引擎,需要存储大量的网页,需要存储大量的网页,并不断优化自己的搜索算法,提升搜索效率。2003年,Google无私的分享了在这一过程中找到的好方法,发表了一篇技术论文公开介绍了自己的谷歌文件系统GFS(Google File System),这是Google为了存储海量搜索数据而设计的专用文件系统。2004年,Doug Cutting基于Google的GFS论文,实现了分布式文件存储系统NDFS(Nutch Distributed File System)。
2006年加盟雅虎,Doug Cutting将NDFS和MapReduce进行了升级改造,并重新命名为Hadoop,NDFS也改为HDFS(Hadoop Distributed File System)。Hadoop这个名字是他儿子的黄色玩具大象的名字。
不久后,Google又发布论文,介绍了他的BigTable,这是一个分布式数据存储系统,一种用来处理海量数据的非关系型数据库。Doug Cutting又一次吸收了Google的精华,在Hadoop中引入了BigTable,将其命名为HBase。
ElasticSearch是什么
Elasticsearch是一个基于Lucene库的搜索引擎。它提供了一个分布式、支持多租户的全文搜索引擎,具有HTTP Web接口和无模式JSON文档。Elasticsearch是用Java开发的,并在Apache许可证下作为开源软件发布。
Lucene和Elasticsearch的关系:
Lucene是一套信息检索工具包,jar包,不包含搜索引擎系统。ElasticSearch是基于Lucene基础上做了一些封装和增强。
应用场景:
- 维基百科,类似百度百科,全文检索,高亮,搜索推荐
- 国外新闻网站,类似搜狐新闻,用户行为日志(点击,浏览,收藏,评论)+社交网络数据,数据分析。。。
- Stack Overflow国外的程序异常讨论论坛
- GitHub(开源代码管理),搜索上千亿行代码
- 电商网站,检索商品
- 日志数据分析,logstash采集日志,ES进行复杂的数据分析,ELK技术(elasticsearch+logstash+kibana)
- 商品价格监控网站
- 商业智能系统
- 站内搜索
ES和Solr的差别
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失败。
-
下载windows版本,将压缩包拷贝至你要安装的磁盘或目录下,解压压缩包,打开,看到如下目录:
目录结构:
bin 启动文件
config 配置文件
log4j2.properties 日志配置文件
jvm.options java虚拟机配置
elasticsearch.yml elasticsearch配置文件,默认9200端口
jdk 开发工具包
lib 相关jar包
logs 日志
modules 相关功能模块
plugins 插件,ik
-
结果如下
安装可视化界面
-
下载node.js,下一步下一步安装,将bin路径添加到环境变量
-
下载可视化es head插件https://github.com/mobz/elasticsearch-head
-
解压后,进入到目录
-
执行
npm install / cnpm install
-
执行
npm run start
,访问:http://localhost:9100
未连接到es,由于ES进程和客户端进程端口号不同,存在跨域问题,所以需要在ES的配置文件中配置下解决跨域问题:
注意:yml语法是强制缩进的,所以需要有空格
重启es服务器,再次连接
了解ELK
ELK是ElasticSearch 、 Logstash、Kibana三大开源框架首字母大写简称。市面上也称为Elastic Stack。Lostash是ELK的中央数据流,用于从不同目标(文件/数据存储/MQ)收集的不同格式数据,经过过滤后支持输出到不同目的地。Kibana可以将elastic的数据通过友好的页面展示出来,提供实时分析的功能。
市面上很多开发只要提到ELK能够一直说出它是一个日志分析架构技术栈总称,但实际上ELK不仅仅适用于日志分析,它还可以支持其他任何数据分析和手机的场景,日志分析和收集知识更具有代表性。并非唯一性。
安装Kibana
Kibana是一个针对ElasticSearch的开源分析及可视化平台,用来搜索、查看交互存储在ElasticSearch索引中的数据。使用Kibana,可以通过各种如表进行高级数据分析及展示。Kibana让海量数据更容易理解。它操作简单,基于浏览器的用户界面可以快速创建仪表板实时显示Elasticsearch查询动态。设置Kibana非常简单。无需编码或者额外的基础构架,几分钟内就可以完成Kibana安装并启动Elasricsearch索引检测。
- 下载kibana
https://www.elastic.co/cn/downloads/kibana
需要和es版本对应
我用的都是7.9.2版本。
- 解压,进入目录
- 访问测试, http://localhost:5601
在这里我们可以做查询操作
这个是英文版的,我们需要在配置里去修改为汉化版
保存后重启kibana
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的疏于对照表:
关系型数据库 | ElasticSearch |
---|---|
数据库 | 索引 |
表 | type |
行 | document |
列 | field |
es中可以包含多个索引(数据库),每个索引中可以包含多个类型(表),每个类型下又包含多个文档(行),每个文档又包含多个字段(列)。
物理设计:
es在后台把每个索引划分成多个分片,每个分片可以在集群中的不同服务器中转移。
逻辑设计:
一个索引类型,包含多个文档,当我们索引一篇文档时,可以通过这样的顺序找到他: 索引-》类型-》文档id(该id实际是个字符串),通过这个组合我们就能索引到某个具体的文档。
文档
es是面向文档的,意味着索引和搜索数据的最小单位是文档,es中,文档有几个重要的属性:
- 自我包含,一篇文档同时包含字段和对应的值,也就是同时包含key:value
- 可以是层次性的,一个文档中包含自文档,复杂的逻辑实体就是这么来的
- 灵活的结构,文档不依赖预先定义的模式,我们知道关系型数据库中,要提前定义字段才能使用,在es中,对于字段是非常灵活的。有时候,我们可以忽略字段,或者动态的添加一个新的字段
Relation DB | Elasticsearch |
---|---|
数据库(database) | 索引(indices) |
表(tables) | types |
行(rows) | documens |
字段(columns) | fields |
尽管我们可以随意的添加或忽略某个字段,但是,每个字段的类型非常重要。因为es会保存字段和类型之间的映射以及其他的设置。这种映射具体到每个映射的每种类型,这也是为什么在es中,类型有时候也称为映射类型。
类型
类型是文档的逻辑容器,就像关系型数据库一样,表格是行的容器。类型中对于字段的定义称为映射,比如name映射为string类型.我们说文档是无模式的,他们不需要拥有映射中所定义的所有字段,当新增加一个字段时,es会自动的将新字段加入映射,但是这个字段不确定他是什么类型,所以最安全的方式是提前定义好所需要的映射。
索引
索引是映射类型的容器,es的索引是一个非常大的集合。索引寻出了映射类型的字段和其他设置。然后他们被存储到了各个分片上。
物理设计:节点和分片工作
一个集群至少有一个节点,而一个节点就是一个es进程,节点可以有多个索引默认的,如果创建索引,索引会有5个分片(primary shard,又称主分片)构成的,每一个主分片都会有一个副本(replica shard,又称复制分片)
上图是一个三个节点的集群,可以看到主分片和复制分片都不会在同一个节点内,这样就算某个节点挂掉也不至于数据丢失。实际上,一个分片是一个Lucene索引,一个包含倒排索引的文件目录,倒排索引的结构使得elasticsearch在不扫描全部文档的情况下,就能告诉你哪些文档包含了特定的关键字。
倒排索引
也常被称为反向索引、置入档案或反向档案,是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。它是文档检索系统中最常用的数据结构。通过倒排索引,可以根据单词快速获取包含这个单词的文档列表。倒排索引主要由两个部分组成:“单词词典”和“倒排文件”。
例如:这里有两个文档,
Study every day,good good up to forever # 文档1
To forever, study ervery day, good good up #文档2
term | doc_1 | doc_2 |
---|---|---|
Study | √ | × |
To | × | √ |
every | √ | √ |
day | √ | √ |
good | √ | √ |
up | √ | √ |
to | √ | × |
forever | √ | √ |
现在我们试图搜索to forever
term | doc_1 | doc_2 |
---|---|---|
to | √ | × |
forever | √ | √ |
total | 2 | 1 |
两个文档都匹配到了,但是文档一比文档二匹配程度更高。
elasticsearch的索引与Lucene的索引对比
在elasticsearch中索引(库)被频繁的使用,这就是术语的使用。在elasticsearch中一个索引被分为多个分片,而每个分片是一个Lucene的索引。所以一个elasticsearch索引是由多个Lucene索引组成的。
至此关于elasticsearch的介绍到此为止。
那么对于elasticsearch的一些操作就在kibana上进行,在下一篇博客中进行介绍。