Elasticsearch 基础介绍
# Elasticsearch简介
## 基础概念
Elasticsearch由Shay banon在2004年进行初步开发,并且在2010年2月发布第一个版本。
此后Shay banon在2012建立Elasticsearch BV公司,继续围绕Elasticsearch提供相关软件和产品。
Elasticsearch是一个实时的分布式搜索分析引擎,它能让你以一个前所未有的体验来探索你的数据。
它常被作用于全文检索、结构化搜索、数据分析这三个功能的组合。

## 功能介绍
Elasticsearch基于Apache Lucene的开源搜索引擎,而Lucene无论是在开源亦或是专有领域来说,它可以被认为是迄今为止最先进、性能最好、功能最丰富的的搜索引擎库。
但是,Lucene仅是一个Java库,要想使用它你必须熟知Java并将其直接集成到你的应用中,更加糟糕的是Lucene非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的。
而Elasticsearch将Lucene当做核心,并屏蔽了大部分复杂的操作,通过简单的RESTful API进行调用,从而让全文搜索变的简单。
## 与SQL的区别
Elasticsearch与MySQL的区别较大,其数据存储采用JSON格式。
在其中,各个名词术语也是不相同的,如下表所示:
| Elasticsearch | SQL |
| -------------------------------------------- | ---- |
| 索引 | 库 |
| 类型(7版本后淡化该概念,8版本可能会被移除) | 表 |
| 文档 | 记录 |
| filed | 字段 |
同时,MySQL并不适用于全文检索,如要查询某个字符串%,必须使用全表扫描
而Elasticsearch则非常适合全文检索,并且可以灵活的存储不同类型的数据
以下是Elasticsearch应用场景:
- 商城的商品搜索
- 所有产品的评论
- 高亮显示搜索内容
- 收集展示各种日志
除此之外,相较于MySQL部署分布式的繁琐,Elasticsearch天生支持分布式,部署简单,维护轻松,也是对运维人员非常友好的一款数据库产品。
一言以蔽之,Elasticsearch的出现并非为了取代SQL,而是专注于SQL不擅长的领域与其进行互补。
# Elasticsearch安装
## 安装方式
Elasticsearch安装方式有以下4种:
1. docker:
优点:
- 部署方便
- 开箱即用
- 启动迅速
缺点:
- 需要有docker相关知识
- 修改配置比较麻烦
- 数据存储需要挂载目录
2. tar
优点:
- 部署灵活
- 对系统侵占性小
缺点:
- 需要自己写启动管理文件
- 目录要提前进行规划
3. rpm | deb:
优点:
- 部署方便
- 启动脚本安装即用
- 存放目录较为标准化
缺点:
- 软件各个组件分散在不同目录
- 卸载可能不干净
- 默认配置需要修改
4. ansible
优点:
- 及其灵活
- 功能全面
- 批量部署速度快
缺点:
- 需要学习ansible语法和规则
- 需要提前规划好所有标准
- 需要有专人进行维护
## Rpm安装
在这里将采用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查询进行准确的搜索。
## 文本(text)
文本是一段普通的非结构化文字。
通常,文本会被分拆成一个个的索引词,存储在elasticsearch 的索引库中。
为了让文本能够进行搜索,文本字段需要事先进行分析了;
当对文本中的关键词进行查询的时候,搜索引擎应该根据搜索条件搜索出原文本。
## 分析(analysis)
分析是将文本转换为索引词的过程,分析的结果依赖于分词器。
比如:FOO BAR、Foo-Bar和 foo bar这几个词有可能会被分析成相同的索引词foo和bar,这些索引词存储在Elasticsearch的索引库中。
## 集群(cluster)
集群由一个或多个节点组成,对外提供服务,对外提供索引和搜索功能。
在所有节点,一个集群有一个唯一的名称默认为“elasticsearch”
此名称是很重要的,因为每个节点只能是集群的一部分,当该节点被设置为相同的集群名称时,就会自动加入集群。
当需要有多个集群的时候,要确保每个集群的名称不能重复,否则节点可能会加入到错误的集群。
请注意,一个节点只能加入到一个集群。
此外,你还可以拥有多个独立的集群,每个集群都有其不同的集群名称。
## 节点(node)
一个节点是一个逻辑上独立的服务,它是集群的一部分,可以存储数据,并参与集群的索引和搜索功能。
就像集群一样 ,节点也有唯一的名字,在启动的时候分配。
如果你不想要默认名称,你可以定义任何你想要的节点名。
这个名字在数据处理中很重要,在Elasticsearch集群通过节点名称进行管理和通信,一个节点可以被配置加入到一个特定的集群。
默认情况下,每个节点会加入名为Elasticsearch 的集群中,这意味着如果你在局域网中部署多个节点,如果网络畅通,他们能彼此发现并自动加入名为Elasticsearch 的一个集群中。
你可以拥有多个你想要的节点。当网络没有集群运行的时候,只要启动一个节点,这个节点会默认生成一个新的集群,这个集群也会有自己的一个节点。
## 分片(shard)
分片是单个Lucene 实例,这是Elasticsearch管理的比较底层的功能。
索引是指向主分片和副本分片的逻辑空间。
对于使用,只需要指定分片的数量,其他不需要做过多的事情。
在开发使用的过程中,我们对应的对象都是索引 ,Elasticsearch 会自动管理集群中所有的分片,当发生故障的时候,Elasticsearch 会把分片移动到不同的节点或者添加新的节点。
一个索引可以存储很大的数据,这些空间可以超过一个节点的物理存储的限制。
例如:十亿个文档占用磁盘空间为 1TB。
仅从单个节点搜索可能会很慢,还有一台物理机器也不一定能存储这么多的数据。
为了解决这一问题 ,Elasticsearch将索引分解成多个分片。
当你创建一个索引,你可以简单地定义你想要的分片数量。
每个分片本身是 一个全功能的、独立的单元,可以托管在集群中的任何节点。
## 主分片
每个文档都存储在一个分片中,当你存储一个文档的时候,系统会首先存储在主分片中,然后会复制到不同的副本中。
默认情况下,一个索引有5个主分片。
你可以事先制定分片的数量,当分片一旦建立,则分片的数量不能修改。
## 副本分片
每一个分片有零个或多个副本。
副本主要是主分片的复制,其中有两个目的:
- 增加高可用性:当主分片失败的时候,可以从副本分片中选择一个作为主分片。
- 提高性能:当查询的时候可以到主分片或者副本分片中进行查询。
默认情況下,一个主分片配有一个副本,但副本的数量可以在后面动态地配置增加。
副本分片必部署在不同的节点上,不能部署在和主分片相同的节点上。
## 索引(index)
索引是具有相同结构的文档集合。
例如:可以有一个客户信息的索引,包括一个产品目录的索引,一个订单数据的索引 。
在系统上索引的名字全部小写,通过这个名字可以用来执行索引、搜索、更新和删除操作等。
在单个集群中,可以定义多个你想要的索引。
## 类型(type)
在索引中,可以定义一个或多个类型,类型是索引的逻辑分区。
在一般情况下,一种类型被定义为具有一组公共字段的文档。
例如,让我们假设你运行一个博客平台,并把所有的数据存储在一个索引中。
在这个索引中,你可以定义一种类型为用户数据,一种类型为博客数据,另一种类型为评论数据。
## 文档(doc)
文档是存储在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
```
Elasticsearch 基础介绍的更多相关文章
- ELK(elasticsearch+kibana+logstash)搜索引擎(二): elasticsearch基础教程
1.elasticsearch的结构 首先elasticsearch目前的结构为 /index/type/id id对应的就是存储的文档ID,elasticsearch一般将数据以JSON格式存储. ...
- 搜索引擎框架之ElasticSearch基础详解(非原创)
文章大纲 一.搜索引擎框架基础介绍二.ElasticSearch的简介三.ElasticSearch安装(Windows版本)四.ElasticSearch操作客户端工具--Kibana五.ES的常用 ...
- 全文搜索引擎Elasticsearch详细介绍
我们生活中的数据总体分为两种:结构化数据 和 非结构化数据. 结构化数据:也称作行数据,是由二维表结构来逻辑表达和实现的数据,严格地遵循数据格式与长度规范,主要通过关系型数据库进行存储和管理.指具有固 ...
- Web3D编程入门总结——WebGL与Three.js基础介绍
/*在这里对这段时间学习的3D编程知识做个总结,以备再次出发.计划分成“webgl与three.js基础介绍”.“面向对象的基础3D场景框架编写”.“模型导入与简单3D游戏编写”三个部分,其他零散知识 ...
- C++ 迭代器 基础介绍
C++ 迭代器 基础介绍 迭代器提供对一个容器中的对象的访问方法,并且定义了容器中对象的范围.迭代器就如同一个指针.事实上,C++的指针也是一种迭代器.但是,迭代器不仅仅是指针,因此你不能认为他们一定 ...
- Node.js学习笔记(一)基础介绍
什么是Node.js 官网介绍: Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js us ...
- Node.js 基础介绍
什么是Node.js 官网介绍: Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js us ...
- 1、git基础介绍及远程/本地仓库、分支
1. Git基础介绍 基于Git进行开发时,首先需要将远程仓库代码clone到本地,即为本地仓库.后续大部分时间都是基于本地仓库上的分支进行编码,最后将本地仓库的代码合入远程仓库. 1.1. 远程仓库 ...
- git基础介绍
git基础介绍 这是git操作的基础篇,是以前的写的操作文档,就没有进行手打,直接把图片贴进来了,你们担待哈,有不正确的地方可以指正出来,我将在第一时间去修改,多谢哈! 一.文件状态:git系统的文件 ...
随机推荐
- Github Actions All In One
Github Actions All In One https://github.com/features/actions https://github.com/marketplace?type=ac ...
- Kotlin & Android & Swift & Flutter & React Native
Kotlin & Android https://www.runoob.com/kotlin/kotlin-tutorial.html Swift 5 & iOS 12 https:/ ...
- vuex & redux
vuex & redux https://vuex.vuejs.org/ https://github.com/xgqfrms/VAIO/ https://scrimba.com/playli ...
- SVG & Sprite & symbol & use
SVG & Sprite & symbol & use https://www.zhangxinxu.com/sp/svgo/ https://www.zhangxinxu.c ...
- NGK公链账本技术浅析
NGK公链账本是一个去中心化加密账本,运行在分布式网络上.分布式账本是区块链技术中最重要的组成部分之一.NGK作为公链资产,在公链中起到桥梁作用,可以促进其他资产(法币.数字资产.股权以及实物资产)交 ...
- ⑧SpringCloud 实战:引入 Actuator监控+整合监控页面
Actuator是什么? Spring Boot Actuator 模块提供了生产级别的功能,比如健康检查,审计,指标收集,HTTP 跟踪等,帮助我们监控和管理Spring Boot 应用.这个模块是 ...
- django学习-13.通过pk值手动设置数据表主键
1.前言 通过django框架的Model层来新增数据库表时,如果在需要新增的表字段里任何一个表字段都没设置主键,框架会默认新增一个表字段id并把该表字段id设置为主键. 那么,如果我们想自己动手设置 ...
- MySQL命名、设计及使用规范
本文转载自MySQL命名.设计及使用规范 导语 最近在看MySQL相关的内容,整理如下规范,作为一名刚刚学习MySQL的菜鸟,整理的内容非常的基础,中间可能涉及到有错误的地方,欢迎批评指正,看到有错误 ...
- 创建一个springboot项目
进入https://start.spring.io/ 再点击GENERATE,下载解压即可 注意配置好阿里云的仓库镜像,免得依赖无法下载 不下载最新版springboot是因为我在测试中遇到了问题,貌 ...
- Dubbo与Zookeeper开发
1.Dubbo 1.1RPC RPC全称是remote procedure call,即远程过程调用.比如有两台服务器A和B,它们上面分别部署了一个服务.此时B服务器想调用A服务器上提供的方法,由于不 ...