Elasticsearch由Shay banon在2004年进行初步开发,而且在2010年2月发布第一个版本。java
此后Shay banon在2012创建Elasticsearch BV公司,继续围绕Elasticsearch提供相关软件和产品。node
Elasticsearch是一个实时的分布式搜索分析引擎,它能让你以一个史无前例的体验来探索你的数据。sql
它常被做用于全文检索、结构化搜索、数据分析这三个功能的组合。docker
Elasticsearch基于Apache Lucene的开源搜索引擎,而Lucene不管是在开源亦或是专有领域来讲,它能够被认为是迄今为止最早进、性能最好、功能最丰富的的搜索引擎库。数据库
可是,Lucene仅是一个Java库,要想使用它你必须熟知Java并将其直接集成到你的应用中,更加糟糕的是Lucene很是复杂,你须要深刻了解检索的相关知识来理解它是如何工做的。bootstrap
而Elasticsearch将Lucene当作核心,并屏蔽了大部分复杂的操做,经过简单的RESTful API进行调用,从而让全文搜索变的简单。vim
Elasticsearch与MySQL的区别较大,其数据存储采用JSON格式。centos
在其中,各个名词术语也是不相同的,以下表所示:数组
Elasticsearch | SQL |
---|---|
索引 | 库 |
类型(7版本后淡化该概念,8版本可能会被移除) | 表 |
文档 | 记录 |
filed | 字段 |
同时,MySQL并不适用于全文检索,如要查询某个字符串%,必须使用全表扫描浏览器
而Elasticsearch则很是适合全文检索,而且能够灵活的存储不一样类型的数据
如下是Elasticsearch应用场景:
除此以外,相较于MySQL部署分布式的繁琐,Elasticsearch天生支持分布式,部署简单,维护轻松,也是对运维人员很是友好的一款数据库产品。
一言以蔽之,Elasticsearch的出现并不是为了取代SQL,而是专一于SQL不擅长的领域与其进行互补。
Elasticsearch安装方式有如下4种:
docker:
优势:
缺点:
tar
优势:
缺点:
rpm | deb:
优势:
缺点:
ansible
优势:
缺点:
在这里将采用rpm进行安装,版本为7.6.1,算是目前较新的版本。
1)安装Java环境,最少要求1.8:
$ yum install -y java-1.8.0-openjdk.x86_64
2)下载安装软件,若是速度慢能够在其余浏览器上进行下载后经过scp传输:
$ cd ~ $ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.6.1-x86_64.rpm
3)进行安装:
$ rpm -ivh elasticsearch-7.6.1-x86_64.rpm
1)从新加载sys项目:
$ systemctl daemon-reload
2)配置开机启动:
$ systemctl enable elasticsearch.service
3)启动Elasticsearch服务(过程较慢,查看日志,耐心等待):
$ systemctl start elasticsearch.service
4)查看启动状态,确保配置文件没有问题:
$ systemctl status elasticsearch.service
5)因为Elasticsearch启动较慢,检查服务进程是否成功启动:
$ ps -ef | grep elasticsearch $ netstat -lnpt | grep 9200 # 查看9200端口
若是启动失败,请检查内存等是否充裕,或者进行jvm内存限制。
经过如下命令查看Elasticsearch安装目录:
$ rpm -ql elasticsearch
经过如下命令查看Elasticsearch配置文件:
$ rpm -qc elasticsearch
重要目录与文件:
/etc/elasticsearch/elasticsearch.yml # 配置文件 /etc/elasticsearch/jvm.options # jvm虚拟机配置文件 /etc/init.d/elasticsearch # init启动文件 /etc/sysconfig/elasticsearch # 环境变量配置文件 /usr/lib/sysctl.d/elasticsearch.conf # sysctl变量文件 /usr/lib/systemd/system/elasticsearch.service # systemd启动文件 /var/lib/elasticsearch # 数据目录 /var/log/elasticsearch # 日志目录 /var/run/elasticsearch # pid目录
Elasticsearch的默认配置已经作得很是好,可是如下一些配置你能够进行选配:
# 查看数据和日志目录 $ egrep -v "^#" /etc/elasticsearch/elasticsearch.yml
配置项:
cluster.name: my-application # 集群名称 node.name: node-1 # 节点名称 path.data: /data/elasticsearch # 数据目录 path.logs: /var/log/elasticsearch # 日志目录 bootstrap.memory_lock: true # 锁定内存 network.host: localhost # 绑定IP地址 http.port: 9200 # 绑定端口号 discovery.zen.ping.unicast.hosts: [“localhost”] # 集群发现的通信节点 discovery.zen.minimum_master_nodes: 2 # 最小主节点数
修改内存配置,打开注释:
$ vim /etc/elasticsearch/elasticsearch.yml # 所在集群名称与该服务在集群中的名称 cluster.name: my-application node.name: node-1 # 服务绑定的地址和端口 network.host: 192.168.0.110 http.port: 9200 # 做为集群主节点启动 cluster.initial_master_nodes: ["node-1"] # 是否开启内存限制 action.destructive_requires_name: true
在jvm虚拟机中进行内存限定,根据实际状况进行设定,因为我这台centos7的服务器内存较小,所以设定的也比较小,注意这里最大不能超过32G:
$ vim /etc/elasticsearch/jvm.options -Xms512m # 最小内存 -Xmx512m # 最大内存
重启生效:
$ systemctl restart elasticsearch.service
若是你的数据目录发生了变动,请确保使用Elasticsearch的管理用户对目录进行受权操做:
$ id elasticsearch uid=996(elasticsearch) gid=992(elasticsearch) 组=992(elasticsearch)
再也不进行演示。
在Elasticsearch中索引词(term)是一个可以被索引的精确值。
foo、Foo、FOO几个单词是不一样的索引词。
索引词(term)是能够经过term查询进行准确的搜索。
文本是一段普通的非结构化文字。
一般,文本会被分拆成一个个的索引词,存储在elasticsearch 的索引库中。
为了让文本可以进行搜索,文本字段须要事先进行分析了;
当对文本中的关键词进行查询的时候,搜索引擎应该根据搜索条件搜索出原文本。
分析是将文本转换为索引词的过程,分析的结果依赖于分词器。
好比:FOO BAR、Foo-Bar和 foo bar这几个词有可能会被分析成相同的索引词foo和bar,这些索引词存储在Elasticsearch的索引库中。
集群由一个或多个节点组成,对外提供服务,对外提供索引和搜索功能。
在全部节点,一个集群有一个惟一的名称默认为“elasticsearch”
此名称是很重要的,由于每一个节点只能是集群的一部分,当该节点被设置为相同的集群名称时,就会自动加入集群。
当须要有多个集群的时候,要确保每一个集群的名称不能重复,不然节点可能会加入到错误的集群。
请注意,一个节点只能加入到一个集群。
此外,你还能够拥有多个独立的集群,每一个集群都有其不一样的集群名称。
一个节点是一个逻辑上独立的服务,它是集群的一部分,能够存储数据,并参与集群的索引和搜索功能。
就像集群同样 ,节点也有惟一的名字,在启动的时候分配。
若是你不想要默认名称,你能够定义任何你想要的节点名。
这个名字在数据处理中很重要,在Elasticsearch集群经过节点名称进行管理和通讯,一个节点能够被配置加入到一个特定的集群。
默认状况下,每一个节点会加入名为Elasticsearch 的集群中,这意味着若是你在局域网中部署多个节点,若是网络畅通,他们能彼此发现并自动加入名为Elasticsearch 的一个集群中。
你能够拥有多个你想要的节点。当网络没有集群运行的时候,只要启动一个节点,这个节点会默认生成一个新的集群,这个集群也会有本身的一个节点。
分片是单个Lucene 实例,这是Elasticsearch管理的比较底层的功能。
索引是指向主分片和副本分片的逻辑空间。
对于使用,只须要指定分片的数量,其余不须要作过多的事情。
在开发使用的过程当中,咱们对应的对象都是索引 ,Elasticsearch 会自动管理集群中全部的分片,当发生故障的时候,Elasticsearch 会把分片移动到不一样的节点或者添加新的节点。
一个索引能够存储很大的数据,这些空间能够超过一个节点的物理存储的限制。
例如:十亿个文档占用磁盘空间为 1TB。
仅从单个节点搜索可能会很慢,还有一台物理机器也不必定能存储这么多的数据。
为了解决这一问题 ,Elasticsearch将索引分解成多个分片。
当你建立一个索引,你能够简单地定义你想要的分片数量。
每一个分片自己是 一个全功能的、独立的单元,能够托管在集群中的任何节点。
每一个文档都存储在一个分片中,当你存储一个文档的时候,系统会首先存储在主分片中,而后会复制到不一样的副本中。
默认状况下,一个索引有5个主分片。
你能够事先制定分片的数量,当分片一旦创建,则分片的数量不能修改。
每个分片有零个或多个副本。
副本主要是主分片的复制,其中有两个目的:
默认情況下,一个主分片配有一个副本,但副本的数量能够在后面动态地配置增长。
副本分片必部署在不一样的节点上,不能部署在和主分片相同的节点上。
索引是具备相同结构的文档集合。
例如:能够有一个客户信息的索引,包括一个产品目录的索引,一个订单数据的索引 。
在系统上索引的名字所有小写,经过这个名字能够用来执行索引、搜索、更新和删除操做等。
在单个集群中,能够定义多个你想要的索引。
在索引中,能够定义一个或多个类型,类型是索引的逻辑分区。
在通常状况下,一种类型被定义为具备一组公共字段的文档。
例如,让咱们假设你运行一个博客平台,并把全部的数据存储在一个索引中。
在这个索引中,你能够定义一种类型为用户数据,一种类型为博客数据,另外一种类型为评论数据。
文档是存储在Elasticsearch中的一个JSON格式的字符串。
它就像在关系数据库中表的一行。
每一个存储在索引中的 一个文档都有一个类型和一个ID,每一个文档都是一个JSON对象,存储了零个或者多个字段,或者键值对。
原始的 JSON 文档假存储在一个叫做Sour的字段中。
当搜索文档的时候默认返回的就是这个字段。
映射像关系数据库中的表结构。
每个索引都有一个映射,它定义了索引中的每个字段类型,以及一个索引范围内的设置。
一个映射能够事先被定义,或者在第一次存储文档的时候自动识别。
文档中包含零个或者多个字段,字段能够是一个简单的值(例如字符串、整数、日期),也能够是一 个数组或对象的嵌套结构。
字段相似于关系数据库中表的列。
每一个字段都对应一个字段类型,例如整数、字符串、对象等。
字段还能够指定如何分析该字段的值。
ID是一个文件的惟一标识。
若是在存库的时候没有提供ID,系统会自动生成一个ID。
文档的 index与type的ID必须是惟一的。
复制是一个很是有用的功能,否则会有单点问题。
当网络中的某个节点出现问题的时候,复制能够对故障进行转移,保证系统的高可用。
所以,Elasticsearch容许你建立一个或多个拷贝,你的索引分片就造成了所谓的副本或副本分片。
复制是重要的,主要的缘由有:
索引能够复制零个或者多个分片,一旦复制,每一个索引就有了主分片和副本分片。
分片的数量和副本的数量能够在建立索引时定义,当建立索引后,你能够随时改变副本的数量,但你不能改变分片的数量。
默认情況下,每一个索引分配5个分片和一个副本,这意味着你的集群节点至少要有两个节点,你将拥有5个主要的分片和5个副本分片共计10个分片。
每一个Elasticsearch分片是一个Lucene 的索引。
有文档存储数量限制,你能够在一个单一的Lucene索引中存储的最大值为lucene-5843,极限是2147483519(=integer.max_value-128)个文档。
你可使用cat/shards API监控分片的大小。
Elasticsearch基于Lucene,而Lucene可以作到全文检索的功能就依赖于倒排索引。
document被成功index录入后,Elasticsearch会对index建立一张倒排索引表。
以下所示,这里有2个文档,都在一个index中:
DOCUMENT1 : "Hello,Elasticsearch" DOCUMENT2 : "Hello,World And Elasticsearch"
这个index的倒排索引表以下,它会将上述document的词汇进行拆分并记录:
term(精确查找) | document01 | document02 |
---|---|---|
Hello | √ | √ |
World | × | × |
Hi | × | × |
Elasticsearch | √ | √ |
And | × | √ |
在进行查询时,会经过关键词命中得到分数,分数越高查询的条件排名越靠前。
如,我查询的词汇是 “Hello World”,结果以下:
DOCUMENT2 : Hello 存在 World 存在 得分 2 DOCUMENT1 : Hello 存在 World 不存在 得分 1