Elasticsearch学习指南(计划长期更新)
本博客基于Elasticsearch 7.0进行编写,旨在对自己的所学进行结构化输出,查漏补缺。
博客主页:https://blog.csdn.net/qq1620657419
文章目录
- Elasticsearch学习指南
- Elasticsearch简介
- Elasticsearch与Lucene
- Elasticsearch对比其他方案
- 传统关系型数据库的弊端
- Lucene的弊端
- Elasticsearch优点
- 常用应用领域
- 社区与博客
- Elasticsearch技术概览
- 核心概念
- Node 节点
- Cluster 集群
- Shards 分片
- Replicas 备份/副本
- Index 索引
- Type 类别
- Document 文档
- Settings
- Mapping映射
- Analyzer 分词器
- 搭建Elasticsearch
- 基于压缩包启动Elasticsearch
- 基于Docker启动Elasticsearch
- 使用图形化工具
- 开启CORS访问
- 可能遇到的问题
- JDK8下的启动告警
- UseConcMarkSweepGC弃用告警
- 附录
- 参考资料
Elasticsearch学习指南
Elasticsearch简介
Elasticsearch 是搜索、存储和数据分析引擎,具有分布式、高性能、高可用、可伸缩、易维护的特点。
Elasticsearch与Lucene
Elasticsearch并非从零起步,而是站在巨人的肩膀上。Elasticsearch基于Java编写,其内部使用Lucene做索引与搜索。通过进一步封装Lucene,向开发人员屏蔽了Lucene的复杂性。开发人员无须深入了解检索的相关知识来理解它是如何工作的,只需使用一套简单一致的RESTfulAPI即可,从此全文搜索变得简单。
Elasticsearch对比其他方案
传统关系型数据库的弊端
基于Like的查询会造成索引失效,查询时间复杂度O(n)。
Lucene的弊端
Lucene虽然提供了倒排索引的功能,但是本身只支持单点。如果需要搭建集群,需要自行实现集群管理与负载均衡。同时,Lucene提供的API比Elasticsearch复杂的多。
Elasticsearch优点
- 面向开发者友好,零配置,易装易用。
- ES基于Lucene提供了很多高级功能:复合查询、聚合分析、基于地理位置等。
- 相遇传统数据库,提供了全文检索,同义词处理(美丽的cls>漂亮的cls),相关度排名。聚合分析以及海量数据的近实时(NTR)处理,这些传统数据库完全做不到。
- 实时分析的分布式搜索引擎。Elasticsearch的索引分拆成多个分片,每个分片可以有零个或多个副本。集群中的每个数据节点都可承载一个或多个分片,并且协调和处理各种操作;负载再平衡和路由会自动完成。
- 高可拓展性。大规模应用方面,Elasticsearch可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。
- 可插拔插件支持。Elasticsearch支持多种插件,如分词插件、同步插件、Hadoop插件、可视化插件等。
常用应用领域
- 全文检索
- 搜索推荐
- 日志数据分析
- 商业智能 Business Intelligence
- 数据分析 Data Analysis
社区与博客
Elastic 中文社区
http://www.elasticsearch.cn/
Elastic 中国社区官方博客
https://elasticstack.blog.csdn.net/
铭毅天下
https://elastic.blog.csdn.net/
Elasticsearch技术概览
核心概念
Elasticsearch的核心概念有Node、Cluster、Shards、Replicas、Index、Type、Document、Settings、Mapping和Analyzer。
关系型数据库 | Elasticsearch |
---|---|
数据库Database | 索引Index |
表Table | 索引Index(原为Type,已移除) |
数据行Row | 文档Document |
数据列Column | 字段Field |
约束Schema | 映射Mapping |
Node 节点
节点是组成Elasticsearch集群的基本服务单元,集群中的每个运行中的Elasticsearch服务器都可称之为节点。
在Elasticsearch集群中,节点有三种状态。
- Green:表示节点运行状态为健康状态。所有的主分片和副本分片都可以正常工作,集群100%健康。
- Yellow:黄色,表示节点的运行状态为预警状态。所有的主分片都可以正常工作,但至少有一个副本分片是不能正常工作的。此时集群依然可以正常工作,但集群的高可用性在某种程度上被弱化。
- Red:红色,表示集群无法正常使用。此时,集群中至少有一个分片的主分片及它的全部副本分片都不可正常工作。虽然集群的查询操作还可以进行,但是也只能返回部分数据(其他正常分片的数据可以返回),而分配到这个有问题分片上的写入请求将会报错,最终导致数据丢失。
Cluster 集群
Elasticsearch的集群是由具有相同 cluster.name(默认值为elasticsearch)的一个或多个Elasticsearch节点组成的,各个节点协同工作,共享数据。同一个集群内节点的名字不能重复,但集群名称一定要相同。在实际使用Elasticsearch集群时,一般需要给集群起一个合适的名字来替代cluster.name的默认值。自定义集群名称的好处是,可以防止一个新启动的节点加入相同网络中的另一个同名的集群中。
Shards 分片
当索引的数据量太大时,受限于单个节点的内存、磁盘处理能力等,节点无法足够快地响应客户端的请求,此时需要将一个索引上的数据进行水平拆分。拆分出来的每个数据部分称之为一个分片。一般来说,每个分片都会放到不同的服务器上。进行分片操作之后,索引在规模上进行扩大,性能上也随之水涨船高的有了提升。Elasticsearch依赖Lucene,Elasticsearch中的每个分片其实都是Lucene中的一个索引文件,因此每个分片必须有一个主分片和零到多个副本分片。当软件开发人员在一个设置有多分片的索引中写入数据时,是通过路由来确定具体写入哪个分片中的,因此在创建索引时需要指定分片的数量,并且分片的数量一旦确定就不能更改。当软件开发人员在查询索引时,需要在索引对应的多个分片上进行查询。Elasticsearch会把查询发送给每个相关的分片,并汇总各个分片的查询结果。对上层的应用程序而言,分片是透明的,即应用程序并不知道分片的存在。在Elasticsearch中,默认为一个索引创建5个主分片,并分别为每个主分片创建一个副本。
Replicas 备份/副本
副本指的是对主分片的备份,这种备份是精确复制模式。每个主分片可以有零个或多个副本,主分片和备份分片都可以对外提供数据查询服务。当构建索引进行写入操作时,首先在主分片上完成数据的索引,然后数据会从主分片分发到备份分片上进行索引。当主分片不可用时,Elasticsearch会在备份分片中选举出一个分片作为主分片,从而避免数据丢失。一方面,备份分片既可以提升Elasticsearch系统的高可用性能,又可以提升搜索时的并发性能;另一方面,备份分片也是一把双刃剑,即如果备份分片数量设置得太多,则在写操作时会增加数据同步的负担。
Index 索引
在Elasticsearch中,索引由一个和多个分片组成。在使用索引时,需要通过索引名称在集群内进行唯一标识。
Type 类别
类别指的是索引内部的逻辑分区,通过Type的名字在索引内进行唯一标识。在查询时如果没有该值,则表示需要在整个索引中查询。
7.x版本中已经移除Type
Document 文档
Elasticsearch中最小的数据单元,通常以Json格式显示。Index中的每一条数据叫作一个Document,与关系数据库的使用方法类似,一条文档数据通过_id在Type内进行唯一标识。
Settings
Settings是对集群中索引的定义信息,比如一个索引默认的分片数、副本数等。
Mapping映射
Mapping表示中保存了定义索引中字段(Field)的存储类型、分词方式、是否存储等信息,有点类似于关系数据库(如MySQL)中的表结构信息。在Elasticsearch中,Mapping是可以动态识别的。如果没有特殊需求,则不需要手动创建Mapping,因为Elasticsearch会根据数据格式自动识别它的类型。当需要对某些字段添加特殊属性时,如定义使用其他分词器、是否分词、是否存储等,就需要手动设置Mapping了。一个索引的Mapping一旦创建,若已经存储了数据,就不可修改了。
Analyzer 分词器
一个Analyzer通常由一个Tokenizer和零到多个Filter组成。在Elasticsearch中,默认的标准Analyzer包含一个标准的Tokenizer和三个Filter,即Standard Token Filter、Lower Case Token Filter和Stop TokenFilter。
搭建Elasticsearch
基于压缩包启动Elasticsearch
Elasticsearch可以零配置启动,会下载解压压缩包,就能启起来。下载地址如下所示:
https://www.elastic.co/cn/downloads/elasticsearch
启动bin目录下的elasticsearch/elasticsearch.bat的启动脚本。
访问http://localhost:9200/
{"name" : "DESKTOP-QFLTHE7","cluster_name" : "elasticsearch","cluster_uuid" : "hc3eDw6ARmO2vLliKw5Tjg","version" : {"number" : "7.7.0","build_flavor" : "default","build_type" : "zip","build_hash" : "81a1e9eda8e6183f5237786246f6dced26a10eaf","build_date" : "2020-05-12T02:01:37.602180Z","build_snapshot" : false,"lucene_version" : "8.5.1","minimum_wire_compatibility_version" : "6.8.0","minimum_index_compatibility_version" : "6.0.0-beta1"},"tagline" : "You Know, for Search"
}
基于Docker启动Elasticsearch
拉取镜像
docker pull elasticsearch:7.14.2
单例启动
docker run -d -e ES_JAVA_OPTS="-Xms512m -Xmx512m" -e "discovery.type=single-node" -p 9200:9200 -p 9300:9300 --name elasticsearch elasticsearch:7.14.2
集群启动
docker run -e ES_JAVA_OPTS="-Xms512m -Xmx512m" -d -p 9200:9200 -p 9300:9300 -p 5601:5601 -v /Users/fuhanping/es-cluster/es01/es01.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /Users/fuhanping/es-cluster/es01/plugins1:/usr/share/elasticsearch/plugins -v /Users/fuhanping/es-cluster/es01/data:/usr/share/elasticsearch/data --name ES01 elasticsearch:7.14.2docker run -e ES_JAVA_OPTS="-Xms512m -Xmx512m" -d -p 9200:9200 -p 9300:9300 -p 5601:5601 -v /Users/fuhanping/es-cluster/es01/es02.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /Users/fuhanping/es-cluster/es02/plugins1:/usr/share/elasticsearch/plugins -v /Users/fuhanping/es-cluster/es02/data:/usr/share/elasticsearch/data --name ES02 elasticsearch:7.14.2docker run -e ES_JAVA_OPTS="-Xms512m -Xmx512m" -d -p 9200:9200 -p 9300:9300 -p 5601:5601 -v /Users/fuhanping/es-cluster/es01/es03.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /Users/fuhanping/es-cluster/es03/plugins1:/usr/share/elasticsearch/plugins -v /Users/fuhanping/es-cluster/es03/data:/usr/share/elasticsearch/data --name ES03 elasticsearch:7.14.2
使用图形化工具
elasticsearch-head : https://github.com/mobz/elasticsearch-head
elasticsearch-head是一个纯前端实现的图形化操作Elasticsearch的工具。
开启CORS访问
/config/elasticsearch.yml
http.cors.enabled: true
http.cors.allow-origin: "*"
可能遇到的问题
JDK8下的启动告警
future versions of Elasticsearch will require Java 11; your Java version from [C:\Program Files\Java\jdk1.8.0_202\jre] does not meet this requirement
future versions of Elasticsearch will require Java 11; your Java version from [C:\Program Files\Java\jdk1.8.0_202\jre] does not meet this requirement
Warning: with JDK 8 on Windows, Elasticsearch may be unable to derive correctergonomic settings due to a JDK issue (JDK-8074459). Please use a newerversion of Java.
Warning: MaxDirectMemorySize may have been miscalculated due to JDK-8074459.Please use a newer version of Java or set MaxDirectMemorySize explicitly.
这是因为环境变量中已配置jdk,Elasticsearch启动时默认使用环境变量中的配置,从上面的目录结构中我们已经看到Elasticsearch自带java环境,此时需要更Elasticsearch启动文件,让Elasticsearch使用自带的jdk环境,
elasticsearch-env.bat :39~46
if defined JAVA_HOME (set JAVA="%JAVA_HOME%\bin\java.exe"set JAVA_TYPE=JAVA_HOME
) else (set JAVA="%ES_HOME%\jdk\bin\java.exe"set JAVA_HOME="%ES_HOME%\jdk"set JAVA_TYPE=bundled jdk
)
修改为
set JAVA="%ES_HOME%\jdk\bin\java.exe"set JAVA_HOME="%ES_HOME%\jdk"set JAVA_TYPE=bundled jdk
UseConcMarkSweepGC弃用告警
OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
这是因为从jdk9开始cms垃圾收集器已经被标注为弃用了,可以在elasticsearch安装目录下的config下找到jvm.options文件,用记事本打开,将-XX:+UseConcMarkSweepGC 修改为 -XX:+UseG1GC
附录
参考资料
[1] feintkotlin.两分钟带你认识倒排索引.https://www.bilibili.com/video/BV1db411g79H
[2] 官网教程.Getting started with Elasticsearch.https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started.html
[3] 《从Lucene到Elasticsearch:全文检索实战》.姚攀
[4] 《Elasticsearch实战与原理解析》.牛冬
Elasticsearch学习指南(计划长期更新)相关推荐
- 对于代码复现学习的一些理解||计算机研究生学习笔记||经验分享||深度学习||pytorch||不定期长期更新
代码复习 对于初学者,一开始接触深度学习代码总是困难的,尤其是对于github上满屏英文.复杂的环境.各种各样的报错,有时候哪怕跟着配套的readme.论文.视频,仍然不能成功跑起来. 在经受了一 ...
- 2020前端新技术学习指南(持续更新)
css模块化设计 1. 设计原则 a.可复用能继承要完整 b.周期性迭代 2. 设计方法 a.先整体后部分再颗粒化 b.先抽象再具体 代码规范--ESLint ESLint 是一个代码规范和错误检查工 ...
- 精益数据分析(学习笔记)——长期更新
本文来自阅读书籍<精益数据分析>的学习笔记,加上自己的一些理解,整理出来的思路. 精益数据分析的周期: 上面这张图概括了书籍第二章的内容. 精益数据分析的核心,即上图的这整个周期: 1. ...
- C++学习积累(长期更新)——符号相关
1.c++中的反斜杠符号 \ --续行符 \ 采用续行符后,被分割为上下两行的代码,在编译器编译时将会重新连接在一起. 在普通代码行后面加不加续行符都一样(VC是自动判断续行的),但是在宏定义里面就特 ...
- (*长期更新)软考网络工程师学习笔记——Section 6 网络层上篇
目录 一.网络层的定义 二.IPv4数据报 三.IPv4 (一)分类依据 (二)IP地址分类 (三)网络.主机号位数 (四)特殊IP地址 四.划分子网 五.子网掩码 (一)默认子网掩码 (二)VLSM ...
- (*长期更新)软考网络工程师学习笔记——Section 2 数字传输系统
目录 前言 一.PCM体制 (一)E1 (二)T1 (三)复用 二.SONET(同步光纤网) 三.SDH(同步数字系列) 前言 本系列属于全国计算机技术与软件专业技术资格考试(软考)中级网络工程师的长 ...
- 送书 | 知乎阅读300w+的生信学习指南(更新版)
先送书 在上周的留言送书活动中,恭喜下面这位读者获得书籍"Oracle高性能系统架构实战大全",请及时与生信宝典编辑(shengxinbaodian)联系. 2020过去三分之一了 ...
- Java工程师学习指南(2019最新版)
写过一个Java工程师学习指南,我把它分为了四个部分,第一步是打好Java基础,掌握Java核心技术,第二步是掌握Java Web技术栈,能够做一些项目,第三步是掌握Java方面的进阶技术,包括网络编 ...
- 超硬核Java工程师学习指南,真正的从入门到精通,众多粉丝亲测已拿offer!
最近有很多小伙伴来问我,Java小白如何入门,如何安排学习路线,每一步应该怎么走比较好.原本我以为之前的几篇文章已经可以解决大家的问题了,其实不然,因为我之前写的文章都是站在Java后端的全局上进行思 ...
- Java成神之路技术整理,本文长期更新!
原文地址:https://mp.weixin.qq.com/s/N507Cfb_mbkGvHtg_FIaVg(来源:java技术栈微信公众号) 以下是Java技术栈微信公众号发布的所有关于 Java ...
最新文章
- iOS 4.2 SDK安装
- mysql分页的优势_数据库经典分页几种实例及各优缺点
- Leetcode1706. 球会落何处[C++题解]:模拟
- js 单引号和双引号的使用注意事项
- 如何保证消息不被重复消费啊(如何保证消息消费时的幂等性)?
- Tomcat启动报错整理
- 也谈大公司病1——正确是最大的错误
- 关于glusterfs-3.0.4中AFR修复的一个bug
- C++字符串(string/to_string/append/substr/length/find/rfind/replace/stoi转数字转int)
- 小学生学AD16(入门级别,看这篇就够了)
- lan9252、lan9253和lan9254参数比较
- linux主进程退出时,结束子进程
- visual studio 2019 mac 格式化代码快捷键
- 如何用ChatGPT做一门课?(包含大纲、脚本、PPT文本)
- 在追梦的路上,唯独脚踏实地,才能梦想成真
- 如何进入docker 使用root用户的方式
- SpriteKit中应用TexturePacker
- 【智能优化算法】基于黑猩猩算法求解多目标优化问题附matlab代码
- sass和less是什么?
- IIR数字滤波器设计---双线性变换法