开源的Elasticsearch (以下简称 Elastic)是目前全文搜索引擎的首选。它可以快速地储存、搜索和分析海量数据。维基百科、Stack Overflow、Github 都采用它。
最近在工作上使用到了Elasticsearch全文搜索引擎,打算系统学习一下,出一个系列相关的文章,欢迎大家一起讨论。
ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful Web接口。同时Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。
Lucene是一套用于全文检索和搜寻的开源程式库,由Apache软件基金会支持和提供。Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。在Java开发环境里Lucene是一个成熟的免费开源工具。想要使用它,你必须使用Java来作为开发语言并将其直接集成到你的应用中,因为Lucene非常复杂,所以你需要深入了解检索的相关知识来理解它是如何工作的。
Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。
集群是一个或多个节点(服务器)的集合,它们共同保存您的整个数据,并提供跨所有节点的联合索引和搜索功能。群集由唯一名称标识,默认情况下为“elasticsearch”。
节点是作为群集一部分的单个服务器,存储数据并参与群集的索引和搜索功能。
索引是具有某些类似特征的文档集合。索引由名称标识(必须全部为小写),并且此名称用于在对其中的文档执行索引,搜索,更新和删除操作时引用索引。
一种类型,曾经是索引的逻辑类别/分区,允许您在同一索引中存储不同类型的文档,例如一种类型用于用户,另一种类型用于博客帖子。(在6.0.0中弃用,尽量不要使用该类型)
Index 里面单条的记录称为 Document(文档)。许多条 Document 构成了一个 Index。文档是可以编制索引的基本信息单元。该文档以JSON(JavaScript Object Notation)表示,JSON是一种普遍存在的互联网数据交换格式。在索引中,您可以根据需要存储任意数量的文档
当索引存储的大量数据超过单个节点的硬件限制的数据。Elasticsearch提供了将索引细分为多个称为分片的功能。索引被水平细分为碎片。这意味着每个碎片包含文档的所有属性,但包含的数量比索引少。当你查询的索引分布在多个分片上时,ES会把查询发送给每个相关的分片,并将结果组合在一起,而应用程序并不知道分片的存在。即:这个过程对用户来说是透明的。
每个索引可以拆分为多个分片。索引也可以复制为零(表示没有副本)或更多次。复制后,每个索引都将具有主分片(从中复制的原始分片)和副本分片(主分片的副本)。
副本是一个分片的精确复制,每个分片可以有零个或多个副本。ES中可以有许多相同的分片,其中之一被选择更改索引操作,这种特殊的分片称为主分片。 当主分片丢失时,如:该分片所在的数据不可用时,集群将副本提升为新的主分片。
复制不仅有助于在故障情况下增加数据的可用性,而且还通过在这些副本中执行并行搜索操作来提高搜索的性能。
默认情况下,Elasticsearch中的每个索引都分配了一个主分片和一个副本,这意味着如果群集中至少有两个节点,则索引将具有一个主分片和另一个副本分片(一个完整副本),总共两个每个索引的分片。
本文安装的elasticsearch是基于最新版7.0版本,在ubuntu 16.04下面测试,其他版本的安装也大同小异。
因为Elasticsearch是使用Java语言,所以需要安装JDK,官方推荐是Java 1.8版本或以上。Java环境的安装就不再叙述,这个比较简单。
下载Elasticsearch二进制文件,放入指定目录,运行即可。
Elasticsearch各版本下载地址。
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.0.0-linux-x86_64.tar.gz
tar -xzvf elasticsearch-7.0.0-linux-x86_64.tar.gz
cd elasticsearch-7.0.0/
这里有几个坑需要注意:
Elasticsearch不能以管理员身份root启动,所以我们创建elasticsearch用户组和用户,并给相应文件目录更改所有人和组。
groupadd elasticsearch
useradd -g elasticsearch elasticsearch
chown elasticsearch:elasticsearch -R elasticsearch-7.0.0
然后我们切换用户su elasticsearch
尝试启动,在elasticsearch-7.0.0
目录下,执行启动命令./bin/elasticsearch
。
这里报错是内存大小不够,所以我们需要更改文件/config/jvm.options。默认大小为1g,更改218m。如下:
# Xms represents the initial size of total heap space
# Xmx represents the maximum size of total heap space
#-Xms1g
#-Xmx1g
-Xms218m
-Xmx218m
里面分配的内存的最大值为218MB和最小值218MB,当然可以根据自己的机器情况设置内存大小。
然后我们再次启动应用,可以发现相关的提示信息,在相应端口应用启动了。
我们也可以通过ps -ef | grep "elasticsearch"
,也可以查看到相应信息。
当我们按住Ctrl-C可以终止掉进程。。
如果我们要后台进程运行程序,可以执行命令:
./bin/elasticsearch -d -p pid
这里-d表示后台运行,-p记录进程id。信息保存在$ES_HOME/logs/
目录。$ES_HOME就是指Elasticsearch文件目录。
命令验证curl http://127.0.0.1:9200/
现在我们只能通过localhost来访问,如果想要绑定外网地址,需要更改一些配置,编辑文件config/elasticsearch.yml,如下:
# 集群名称,当同一个网段具有多个elasticsearch集群时cluster.name就成为同一个集群的标识.
cluster.name: es-application
# 节点名称,同一个集群节点名称不能重复.
node.name: node-1
# 是否允许一个节点是否可以成为一个master节点,es是默认集群中的第一台机器为master,如果这台机器停止就会重新选举master
node.master: true
# 允许该节点存储数据(默认开启)
node.data: true
# 绑定监听IP
network.host: 0.0.0.0
# 设置节点间交互的tcp端口,默认是9300
transport.tcp.port: 9300
# 设置节点间交互地址
transport.host: localhost
# 设置对外服务的http端口,默认为9200
http.port: 9200
# 集群默认主节点
cluster.initial_master_nodes: ["node-1"]
更详细的配置,可以参考官方文档。
然后我们重新启动,在浏览器里面访问外网IP,可以得到我们服务信息。
关于Windows下的安装也差不多,下载相应Windows下的二进制包,进入目录下,启动bat命令即可。
.\bin\elasticsearch.bat