Elasticsearch
Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。Elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他语言中都是可用的。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr,也是基于Lucene。
关键字:实时、分布式存储、搜索、分析、引擎
一、简介
Elasticsearch是Elastic Stack核心的分布式搜索和分析引擎。可以快速存储、搜索和分析海量数据。Logstash和Beats有助于收集,聚合和丰富您的数据并将其存储在Elasticsearch中。使用Kibana,您可以交互式地探索,可视化和共享对数据的见解,并管理和监视堆栈。Elasticsearch是发生索引,搜索和分析魔术的地方。
Elasticsearch为所有类型的数据提供近乎实时的搜索和分析。无论您是结构化文本还是非结构化文本,数字数据或地理空间数据,Elasticsearch都能以支持快速搜索的方式有效地对其进行存储和索引。您不仅可以进行简单的数据检索,还可以聚合信息来发现数据中的趋势和模式。随着数据和查询量的增长,Elasticsearch的分布式特性使您的部署可以随之无缝地增长。
虽然并非每个问题都是搜索问题,但是Elasticsearch可以提供速度和灵活性来处理各种用例中的数据:
- 将搜索框添加到应用或网站
- 存储和分析日志,指标和安全事件数据
- 使用机器学习来实时自动建模数据行为
- 使用Elasticsearch作为存储引擎自动化业务工作流程
- 使用Elasticsearch作为地理信息系统(GIS)管理,集成和分析空间信息
- 使用Elasticsearch作为生物信息学研究工具来存储和处理遗传数据
人们使用搜索的新颖方式使我们不断感到惊讶。但是,无论您的用例与其中之一相似,还是您正在使用Elasticsearch解决新问题,在Elasticsearch中处理数据,文档和索引的方式都是相同的。
二、示例
- 您经营一个在线网上商店,您可以在其中允许客户搜索您出售的产品。在这种情况下,您可以使用Elasticsearch存储整个产品目录和库存,并为它们提供搜索和自动完成建议。
- 您想要收集日志或事务数据,并且想要分析和挖掘此数据以查找趋势,统计信息,摘要或异常。在这种情况下,您可以使用Logstash(Elasticsearch / Logstash / Kibana堆栈的一部分)来收集,聚合和解析数据,然后让Logstash将这些数据提供给Elasticsearch。将数据保存在Elasticsearch中后,您可以运行搜索和聚合以挖掘您感兴趣的任何信息。
- 您运行一个价格警报平台,该平台允许精通价格的客户指定诸如“我有兴趣购买特定的电子小工具,并且如果小工具的价格在下个月内从任何供应商处降到$ X以下,我希望收到通知”。 。在这种情况下,您可以抓取供应商价格,将其推入Elasticsearch并使用其反向搜索(Percolator)功能将价格变动与客户查询进行匹配,并在找到匹配项后最终将警报发送给客户。
- 您具有分析/业务智能需求,并且想要快速调查,分析,可视化并针对大量数据(即数百万或数十亿条记录)提出临时问题。在这种情况下,您可以使用Elasticsearch存储数据,然后使用Kibana(Elasticsearch / Logstash / Kibana堆栈的一部分)构建自定义仪表板,这些仪表板可以可视化对您重要的数据方面。此外,您可以使用Elasticsearch聚合功能对数据执行复杂的商业智能查询。
三、Mysql与ES的爱恨情仇
我们知道,ES最大的功能是用来模糊查询,但是mysql不也可以模糊查询么?为什么要多此一举不用mysql而转而使用ES呢?
先来看看一个简单的mysql模糊查询:
select * from user where name like '%summer%'
此时的确会把有关summer的名字都找出来,但是我们的mysql语句是对整个表进行索引,如果此时一个表中的记录包含上亿条,那么我们的查询速度会是秒级的,而我们知道mysql中也有索引,它使用特别的数据结构来达到高效的查询结果,但索引却不能被我们拿来自己diy。
再说,我们上面查找出来的数据量可能高达上百万,并且没有任何先惯性,胡子眉毛一把抓,这样的搜索结果很可能会导致用户体验下降。
最后,我们在使用google的时候,搜索Mysql时我们经常使用mysql来代替,但是浏览器也知道我们想找的就是Mysql。
而Elasticsearch是专门做搜索的,就是为了解决上面所讲的问题而生的,换句话说:
- Elasticsearch对模糊搜索非常擅长(搜索速度很快)
- 从Elasticsearch搜索到的数据可以根据评分过滤掉大部分的,只要返回评分高的给用户就好了(原生就支持排序)
- 没有那么准确的关键字也能搜出相关的结果(能匹配有相关性的记录)
四、基本概念
1. index:索引
动词:相当于Mysql中的insert
名词:相当于Mysql中的Database
2. Type:类型
在index中,可以定义一个或多个类型。
类似于Mysql中的Table,每一种类型的数据放在一起。
这个在新的Elasticsearch版本已经废除(在以前的Elasticsearch版本,一个Index下支持多个Type–有点类似于消息队列一个topic下多个group的概念)
3. Document:文档
保存在某个索引下,某种类型的一个数据。文档时json格式的,Document就像是Mysql中的某个Table里面的内容。
4. Field
相当于数据库的Column的概念
5. Mapping
相当于数据库的Schema的概念
6. DSL
相当于数据库的SQL(给我们读取Elasticsearch数据的API)
五、其他概念
cluster:代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。es的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看es集群,在逻辑上是个整体,你与任何一个节点的通信和与整个es集群通信是等价的。
shards:代表索引分片,es可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改。
replicas:代表索引副本,es可以设置多个索引的副本,副本的作用一是提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高es的查询效率,es会自动对搜索请求进行负载均衡。
recovery:代表数据恢复或叫数据重新分布,es在有节点加入或退出时会根据机器的负载对索引分片进行重新分配,挂掉的节点重新启动时也会进行数据恢复。
river:代表es的一个数据源,也是其它存储方式(如:数据库)同步数据到es的一个方法。它是以插件方式存在的一个es服务,通过读取river中的数据并把它索引到es中,官方的river有couchDB的,RabbitMQ的,Twitter的,Wikipedia的。
gateway:代表es索引快照的存储方式,es默认是先把索引存放到内存中,当内存满了时再持久化到本地硬盘。gateway对索引快照进行存储,当这个es集群关闭再重新启动时就会从gateway中读取索引备份数据。es支持多种类型的gateway,有本地文件系统(默认),分布式文件系统,Hadoop的HDFS和amazon的s3云存储服务。
discovery.zen:代表es的自动发现节点机制,es是一个基于p2p的系统,它先通过广播寻找存在的节点,再通过多播协议来进行节点之间的通信,同时也支持点对点的交互。
Transport:代表es内部节点或集群与客户端的交互方式,默认内部是使用tcp协议进行交互,同时它支持http协议(json格式)、thrift、servlet、memcached、zeroMQ等的传输协议(通过插件方式集成)。
六、倒排索引
假设我们有这样5个数据:
- 红海行动
- 探索红海行动
- 红海特别行动
- 红海纪录篇
- 特工红海特别探索
首先,我们获取这个数据之后,先将这几个进行分词,红海行动可以变成红海行和行动,余下的五个也类似操作。之后我们就可以组成下面的这样一张表。
词 | 记录 |
---|---|
红海 | 1,2,3,4,5 |
行动 | 1,2,3 |
探索 | 2,5 |
特别 | 3,5 |
纪录篇 | 4 |
特工 | 5 |
接下来,如果我们需要搜索:红海特工行动?就会先进行分词,变成:红海、特工、行动。当这个分好之后,再去表里面查找,查看是否有相同的。我们发现红海、行动和特动都存在,此时就会产生一个相关性得分:在红海特别行动里面有3个词,与我们输入的红海特工行动有两个相似的词,而5里面有4个词,也是与我们输入的有两个相同,因此,得分就是2/3
和2/4
。这种根据某个词(不完整的条件)再查找对应记录,叫做倒排索引。
七、安装
docker安装elasticsearrch看下篇文章:传送门
kibana安装:
我们使用elasticsearch如果想可视化,可以下载kibana来进行数据的可视化操作
下拉镜像:
docker pull kibana:7.10.1
注意:这里的kibana版本最好和elasticsearch一样,一味的选择lastest可能会产生不知名的后果
创建实例:
docker run --name kibana -e ELASTICSEARCH_HOSTS=http://自己的ip地址:9200 -p 5601:5601 -d kibana
完成以后,可以打开浏览器输入:IP地址:5601
,如果出现以下图片说明成功:
如果出现:
Unable to connect to Elasticsearch at http://elasticsearch:9200和Unable to revive connection: http://elasticsearch:9200/