Lucene、ElasticSearch和solr

Lucene

​ Lucene 是一个开源、免费、高性能、纯 Java 编写的全文检索引擎,可以算作是开源领域最好的全文检索工具包。

​ 在实际开发中,Lucene 几乎适用于任何需要全文检索的场景,所以 Lucene 先后发展出好多语言版本,例如 C++、C#、Python 等。

​ 早在 2005 年,Lucene 就升级为 Apache 顶级开源项目。它的作者是 Doug Cutting,有的人可能没听过这这个人,不过你肯定听过他的另一个大名鼎鼎的作品 Hadoop。

​ 不过需要注意的是,Lucene 只是一个工具包,并非一个完整的搜索引擎,开发者可以基于 Lucene 来开发完整的搜索引擎。比较著名的有 Solr、ElasticSearch,不过在分布式和大数据环境下,ElasticSearch 更胜一筹。

Lucene 主要有如下特点:

  • 简单
  • 跨语言
  • 强大的搜索引擎
  • 索引速度快
  • 索引文件兼容不同平台

ElasticSearch

​ ElasticSearch 是一个分布式、可扩展、近实时性的高性能搜索与数据分析引擎。ElasticSearch 基于 Java 编写,通过进一步封装 Lucene,将搜索的复杂性屏蔽起来,开发者只需要一套简单的 RESTful API 就可以操作全文检索。

​ ElasticSearch 在分布式环境下表现优异,这也是它比较受欢迎的原因之一。它支持 PB 级别的结构化或非结构化海量数据处理

整体上来说,ElasticSearch 有三大功能:

  • 数据搜集
  • 数据分析
  • 数据存储

ElasticSearch 的主要特点:

  1. 分布式文件存储。
  2. 实时分析的分布式搜索引擎。
  3. 高可拓展性。
  4. 可插拔的插件支持。

ElasticSearch安装

下载

​ 首先到elastic.co或者elasticsearch.cn下载自己系统版本的Elasticsearch,这里用的是7.4.2。可以根据自己的需要下载不同的版本。直接解压放到电脑中间就行。压缩包中的目录结构如下:

  • bin:可执行文件在里面,运行es的命令就在这个里面,包含了一些脚本文件等
  • config 配置文件目录
  • jdk: java环境
  • lib:依赖的jar, 类库
  • logs:日志文件
  • modules:es相关的模块
  • plugins:可以自己开发的插件
  • data:这个目录没有,自己新建一下, 这个作为索引目录

修改elasticsearch.yml文件

  • 修改集群名称和节点名称

image-20210222154417314

  • 修改集群节点

image-20210222154604361

  • 修改data和log的保存地址

image-20210222150846587

  • 修改es的网络ip

image-20210222151050200

修改JVM参数

​ Elasticsearsh默认的Xms和Xmx都是1G,如果虚拟机或者电脑内存不够大,可以修改这个参数,保证Elasticsearch能正常使用。还是进入config文件夹,找到JVM.properties文件,打开并修改到自己想要的大小。

image-20210222151500543

添加用户(Mac用户忽略)

​ es不允许root用户操作它,所以我们要新建一个用户,具体操作如下:

1
2
3
4
useradd esuser
chown -R esuser:esuser /usr/local/elasticsearch-7.4.2
su esuser
whoami # 显示自身用户名称

启动

​ 直接进入Elasticsearch的bin目录,执行./elasticsearch即可,如果要后台启动则执行./elasticsearch -d,启动成功以后,访问http://localhost:9200/看到类似如下信息的,就说明成功了。

image-20210222155212549

停止

​ 如果是前台启动,那么执行Ctrl+C即可,如果是后台启动,可以执行如下操作:

1
2
3
4
5
6
7
8
9
10
[esuser@xxx bin]$ jps
45413 RemoteMavenServer36
20470 Launcher
86937 Elasticsearch
89372 Jps
[esuser@xxx bin]$ kill 86937
[esuser@xxx bin]$ jps
89557 Jps
45413 RemoteMavenServer36
20470 Launcher

HEAD 插件安装

​ 为了方便的看到Elasticsearch上的信息,我们可以安装Elasticsearch-head插件。安装方法如下:

方式一:

​ 直接在谷歌插件商店搜索浏览器插件安装Elasticsearch-head,点击安装即可。

方式二(需要git和nodejs):

​ 访问elasticsearch-head下载安装,操作如下:

1
2
3
4
git clone git://github.com/mobz/elasticsearch-head.git
cd elasticsearch-head
npm install
npm run start

​ 启动成功以后,访问http://localhost:9100/即可,但是要注意,此时看不到集群数据。原因在于这里通过跨域的方式请求集群数据的,默认情况下,集群不支持跨域,所以这里就看不到集群数据。解决办法如下,修改 es 的 config/elasticsearch.yml 配置文件,添加如下内容,使之支持跨域:

1
2
http.cors.enabled: true
http.cors.allow-origin: "*"

​ 配置完成后,重启 es,此时 head 上就有数据了。

image-20210222160730730

kibana安装

​ Kibana 是一个 Elastic 公司推出的一个针对 es 的分析以及数据可视化平台,可以搜索、查看存放在 es 中的数据。

安装步骤如下:

  1. 下载 Kibana:https://www.elastic.co/cn/downloads/kibana
  2. 解压
  3. 配置 es 的地址信息(可选,如果es是默认地址以及端口,可以不用配置,具体的配置文件是 config/kibana.yml)
  4. 执行 ./bin/kibana 文件启动
  5. localhost:5601访问即可

Elasticsearch分布式安装

此为本地模拟,作出如下假设:

  • 一主二从
  • master 的端口是 9200,slave 端口分别是 9201 和 9202

首先修改 master 的 config/elasticsearch.yml 配置文件:

1
2
node.master: true
network.host: 127.0.0.1

配置完成后,重启 master。

将 es 的压缩包解压两份,分别命名为 slave01 和 slave02,代表两个从机。

分别对其进行配置。

slave01/config/elasticsearch.yml

1
2
3
4
5
6
# 集群名称必须保持一致
cluster.name: my-elasticsearch
node.name: slave01
network.host: 127.0.0.1
http.port: 9201
discovery.zen.ping.unicast.hosts: ["127.0.0.1"]

slave02/config/elasticsearch.yml

1
2
3
4
5
6
# 集群名称必须保持一致
cluster.name: my-elasticsearch
node.name: slave02
network.host: 127.0.0.1
http.port: 9202
discovery.zen.ping.unicast.hosts: ["127.0.0.1"]

然后分别启动 slave01 和 slave02。启动后,可以在 head 插件上查看集群信息。

image-20210222161119543

ElasticSearch 核心概念

集群(Cluster)

​ 一个或者多个安装了 es 节点的服务器组织在一起,就是集群,这些节点共同持有数据,共同提供搜索服务。一个集群有一个名字,这个名字是集群的唯一标识,该名字为 cluster name,默认的集群名称是elasticsearch,具有相同名称的节点才会组成一个集群

可以在 config/elasticsearch.yml 文件中配置集群名称:

1
cluster.name: javaboy-es

在集群中,节点的状态有三种:绿色、黄色、红色

  • 绿色:节点运行状态为健康状态。所有的主分片、副本分片都可以正常工作。
  • 黄色:表示节点的运行状态为警告状态,所有的主分片目前都可以直接运行,但是至少有一个副本分片是不能正常工作的。
  • 红色:表示集群无法正常工作。

节点(Node)

​ 集群中的一个服务器就是一个节点,节点中会存储数据,同时参与集群的索引以及搜索功能。一个节点想要加入一个集群,只需要配置一下集群名称即可。默认情况下,如果我们启动了多个节点,多个节点还能够互相发现彼此,那么它们会自动组成一个集群,这是 es 默认提供的,但是这种方式并不可靠,有可能会发生脑裂现象。所以在实际使用中,建议一定手动配置一下集群信息。

索引(Index)

索引可以从两方面来理解:

名词解释:具有相似特征文档的集合。

动词解释:索引数据以及对数据进行索引操作。

类型(Type)

​ 类型是索引上的逻辑分类或者分区。在 es6 之前,一个索引中可以有多个类型,从 es7 开始,一个索引中,只能有一个类型。在 es6.x 中,依然保持了兼容,依然支持单 index 多个 type 结构,但是已经不建议这么使用。

文档(Document)

​ 一个可以被索引的数据单元。例如一个用户的文档、一个产品的文档等等。文档都是 JSON 格式的。

分片(Shards)

​ 索引都是存储在节点上的,但是受限于节点的空间大小以及数据处理能力,单个节点的处理效果可能不理想,此时我们可以对索引进行分片。当我们创建一个索引的时候,就需要指定分片的数量。每个分片本身也是一个功能完善并且独立的索引。

默认情况下,一个索引会自动创建 1 个分片,并且为每一个分片创建一个副本。

副本(Replicas)

​ 副本也就是备份,是对主分片的一个备份。

Settings

​ 集群中对索引的定义信息,例如索引的分片数、副本数等等。

Mapping

​ Mapping 保存了定义索引字段的存储类型、分词方式、是否存储等信息。

Analyzer

​ 字段分词方式的定义。

ElasticSearch Vs 关系型数据库

关系型数据库 ElasticSearch
数据库 索引
类型
文档
字段
表结构 映射(Mapping)
SQL DSL(Domain Specific Language)
delect * from xxx GET http://
update xxx set xx=xxx PUT http://
delete xxx DELETE http://
索引 全文索引