Elasticsearch 笔记

2023-10-30

Elasticsearch 快速安装

  • Elasticsearch 基于 Java 语言开发的,需要安装 JDK环境,Elasticsearch 7要求安装 JDK1.8以上版本。

  • 支持安装的平台:Linux、Windows操作系统,支持使用 Docker直接启动,一般可以直接使用官方提供的免安装压缩包(ZIP和tar.gz文件包),直接解压就可完成安装,官网还提供了 Linux 下的 DEB 和 RPM 安装包,以及windows下的MSI安装包。

  • 支持历史版本下载

  • 官网下载地址:https://www.elastic.co/cn/downloads/elasticsearch

image-20220416024513297

安装启动

官网下载对应版本的软件包:https://www.elastic.co/cn/downloads/elasticsearch;如果要下载历史版本,页面右侧可提供下载

下载版本:8.1.2

Linux环境:centos 7.9

下载地址:https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.1.2-linux-x86_64.tar.gz

image-20220416085504986

  • 下载安装包:

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.1.2-linux-x86_64.tar.gz

image-20220416085947209

  • 解压安装包:
# 把软件包放在/usr/local/路径下,不过放哪里都无所谓的
mv elasticsearch-8.1.2-linux-x86_64.tar.gz /usr/local/
# 解压软件包
tar -xf elasticsearch-8.1.2-linux-x86_64.tar.gz			

image-20220416090239955

  • 创建elasticsearch用户:不可以以root用户启动
# root用户下执行
# 创建用户 es
useradd es
# 授权
chown -R es elasticsearch-8.1.2

image-20220416090739170

  • 重要的目录结构

bin:存放执行文件,例如启动脚本、密钥工具等。

config:Elasticsearch所有的配置文件都在这个目录下。

logs:默认的日志存放位置,实际中一般需要自行更改。

data:默认的索引数据存储位置,运行后自动生成此文件夹,实际中一般需要自行更改。

image-20220416094300882

  • 切换用户后运行
# 切换到es用户
su es
# 进入/bin运行程序
cd elasticsearch-8.1.2/bin/
./elasticsearch
# 也可后台以守护进程方式运行
./elasticsearch -d

image-20220416094506205

  • 查看输出日志
# 进入logs
cd logs
# 实时查看启动日志
tail -f elasticsearch.log

image-20220416100145587

问题踩坑

  1. 日志输出:received plaintext http traffic on an https channel, closing connection Netty4HttpChannel

image-20220416101045741

解决办法:开启了SSL认证,需要将此配置关闭

修改elasticsearch.yml 文件配置,将xpack.security.http.ssl:enabled值设置成false后重新启动

image-20220416101631056

  1. 访问9200端口需要输入账号密码

image-20230207155124314

解决办法:elasticsearch内置了一些用户和角色,用以提供认证功能,默认情况下这些用户是没有设置密码的,在设置密码前无法访问,既然无法访问,我们就关闭吧。修改elasticsearch.yml 文件配置,将xpack.security.enabled值设置成false后重新启动。

image-20220416103251956

再次访问一下验证就OK了,

image-20230207155209383

状态验证

得益于Elasticsearch强大的REST API,可以使用它与集群进行交互,

命令行键入:curl -X GET "http://localhost:9200/_cat/health?v"

  • 检查集群、节点和索引 的运行状况、状态和统计信息
  • 管理集群、节点和索引数据和元数据
  • 对索引执行CRUD和搜索操作
  • 执行高级搜索操作,分页、过滤、排序等

image-20220416103930710

  1. 集群健康信息:集健康状态有绿色(green)、黄色(yellow),红色(red)三种

    绿色:一切正常(集群功能全部可用)

    黄色:所有数据都可用,但某些副本尚未分配(集群完全正常工作)

    红色:由于某些原因,某些数据不可用(集群只有部分功能正常工作):可用的分片可以继续提供搜索请求,但是需要尽快修复它,因为存在未分配的分片

  2. 以上信息的输出含义:

    epoch:时间戳

    timestamp:时间戳

    cluster:集群名称

    status: green代表健康;yellow代表分配了所有主分片,但至少缺少一个副本,此时集群数据仍旧完整;red代表部分主分片不可用,可能已经丢失数据。

    node.total:代表在线的节点总数量

    node.data:代表在线的数据节点的数量

    shardsactive_shards:存活的分片数量

    pri:active_primary_shards 存活的主分片数量 正常情况下 shards的数量是pri的两倍。

    relo:relocating_shards 迁移中的分片数量,正常情况为 0

    init:initializing_shards 初始化中的分片数量 正常情况为 0

    unassign:unassigned_shards 未分配的分片 正常情况为 0

    pending_tasks:准备中的任务,任务指迁移分片等 正常情况为 0

    max_task_wait_time:任务最长等待时间

    active_shards_percent:正常分片百分比 正常情况为 100%

Elasticsearch 基础使用

查看节点列表

对于GET /_cat/nodes?v 输出信息的解读:

  • ip:节点的IP地址
  • heap.percent:堆内存占用百分比
  • ram.percent:内存占用百分比
  • cpu:CPU占用百分比
  • load_1m:1分钟的系统负载
  • load_5m:5分钟的系统负载
  • load_15m:15分钟的系统负载
  • node.role:节点的角色
  • master:是否是主节点
  • name:节点名称
curl -X  GET "http://localhost:9200/_cat/nodes?v"
# 以下输出表示这个集群只有一个节点,名称为vm01

image-20220416141023822

# 举其他集群环境的一个例子
curl -X  GET "http://xx.xx.xx.xx:xxxx/_cat/nodes?v"

image-20220416141627632

列出索引信息

列出环境中的索引信息:GET /_cat/indices?v

返回信息解读:

  • health:索引健康状态

  • status:索引开启状态

  • index:索引名称

  • uuid:索引的UUID

  • pri:索引主分片数

  • rep:索引副分片数

  • docs.count:索引文档总数

  • docs.deleted:索引中删除状态的文档

  • store.size:主分片+副本分片的大小

  • pri.store.size:主分片的大小

curl -X  GET http://localhost:9200/_cat/indices?v
# 以下表示集群中还没有索引

image-20220416143013152

# 举一个其他环境的例子
curl -X  GET "http://xx.xx.xx.xx:xxxx/_cat/indices?v"

image-20220416143213731

查看节点分片信息

显示每个节点的分片信息:GET _cat/allocation?v

  • shards:节点承载的分片数量
  • disk.indices:索引占用的空间大小
  • disk.used:节点所在机器已使用的磁盘空间大小
  • disk.avail:节点可用空间大小
  • disk.total:节点总空间大小
  • disk.percent:节点磁盘占用百分比
  • host:节点host
  • ip:节点ip
  • node:节点名称
# 查看初始环境的节点分片信息
curl -X  GET http://localhost:9200/_cat/allocation?v

image-20220416144331070

# 集群环境一些例子
curl -X  GET "http://xx.xx.xx.xx:xxxx/_cat/allocation?v"

image-20220416144716607

其他的一些信息查询

除以上常用的之外,还提供了aliases、count、health、master、nodeattrs、pending_tasks、plugins、recovery、segments、shards、thread_pool、templates的查看,用户和上述一致的。

创建索引

使用PUT方法创建索引,末尾调用pretty可进行友好返回显示。

# 创建一个名为index1的索引,然后再次列出所有索引
curl -XPUT "http://localhost:9200/index1?pretty"
curl -XGET "http://localhost:9200/_cat/indices?v"
# 查看索引信息:一个名为index1的索引,他有一个分片和一个副本,里面有0个文档(默认的规则)
# 为什么会是黄色状态:默认分片有一个副本,但是副本为了高可用,是不能和主分片在一个节点上的,且只有一个节点运行,所以健康状态是黄色的

image-20220416152739148

索引和查询文档

我们将一些数据放在index1的索引中,可以通过postman工具,这样方便一点:

  • 这就在index1索引中成功创建了一个新的文档,这个文档的ID是1,如果index1索引不存在,那么它会自动创建该索引

image-20220416155146284

  • 检索一下刚才创建的索引:不用传递任何参数哈

image-20220416155408079

删除索引

使用DELETE删除刚才创建的索引:返回true

image-20220416155711986

再查看所有的索引:没有索引了

image-20220416155819028

修改数据

前提:先创建一个index1的索引,然后加一些数据进去测试:3个索引,每个索引有2个文档

image-20220416160614076

  1. 如果PUT指定ID的文档到相关索引里面,将替换该ID的文档,即重新索引;如果是不同的ID,则新增一个文档
  2. 新增文档时候,ID是可选的,如果没有指定ID,则生成一个随机ID

image-20220416161038706

  1. 更新文档:并不是就地更新,而是删除旧的文档,然后索引一个新的文档,但对我们程序调用来说,只调用一次,由于底层数据结构决定了所有的更新操作都是先删除就文档,再插入一条新的文档,和关系型数据库不一样,无法做到字段级别的更新

    举例:就拿上面随机新增的ID进行操作:更新一下文档内容:name的值等于hjie

    image-20220416161633617

    查询最新的文档信息内容:

    image-20220416161805611

  2. 删除文档:删除上述随机生成ID的文档,使用DELETE方法

    image-20220416162030175

  3. 批量操作:除了能够索引、更新和删除单个文档外,Elasticsearch还提供了使用批量API批量执行上述任何操作的功能,非常棒!

    不过对于我来说,就不演示了,主要是演示了没成功了,应该是格式问题,不经常用觉得挺复杂的,批量操作的API可以参考资料:https://www.jianshu.com/p/7928678cc230/

    a1bcccfb-5e04-433f-8a0e-9524ea9807a4

    扩展:对于删除操作,并不会立即删除对应的源文档,删除只是删除了文档的ID,

    批量操作:不会因为其中一个操作失败而失败,返回时候会给予一个状态值,看批量操作是否失败

探索数据

从网上搞的示例数据:accounts.json导入到系统中

image-20220416172447280

查看导入的索引情况:索引名称test:包含了1000个文档

image-20220416172537301

搜索API

通过REST请求URL搜索参数;通过REST请求主体发送搜索参数。

测试:返回test索引中的所有文档

方式:通过主体body形式搜索

部分数据结果如下:

image-20220416173440071

另一种URL参数搜索:curl -X GET "http://localhost:9200/test/_search?q=*&sort=account_number:asc&pretty"

说明:test参数指明了所用的索引,_search指示这是一个搜索请求(_search endpoint),q=*参数指Elasticsearch匹配指定索引中的所有文档。

sort=account_number:asc参数指示使用每个文档的account_number字段按升序对结果进行排序,pretty参数告诉Elasticsearch返回漂亮打印的JSON结果。

image-20220416173706639

结果说明:

  • 第2行,took表示Elasticsearch执行搜索所用的时间,单位是ms。

  • 第3行,timed_out用来指示搜索是否超时。

  • 第4行,_shards指示搜索了多少分片,以及搜索成功和失败的分片的计数。

  • 第10行,hits用来实际搜索结果集。

  • 第11行,hits.total是包含与搜索条件匹配的文档总数信息的对象。

  • 第12行,hits.total.value表示总命中计数的值(必须在hits.total.relation上下文中解释)。

  • 第13行,确切来说,默认情况下,hits.total.value是不确切的命中计数,在这种情况下,当hits.total.relation的值是eq时,hits.total.value的值是准确计数。当hits.total.relation的值是gte时,hits.total.value的值是不准确的。

  • 第16行,hits.hits是存储搜索结果的实际数组(默认为前10个文档)。

  • 第35行,hits.sort表示结果排序键(如果请求中没有指定,则默认按分数排序)。

  • hits.total的准确性由请求参数track_total_hits控制,当设置为true时,请求将准确跟踪总命中数(“relation”:“eq”)。它默认为10000,这意味着总命中数精确跟踪多达10000个文档,当结果集大于10000时,hits.total.value的值将是10000,也就是不准确的。可以通过将track_total_hits显式设置为true强制进行精确计数,但这会增大集群资源的开销。

  • 搜索一旦返回结果,将完全完成请求,不会再消耗服务器资源。

查询语言

提供了一种JSON风格的语言来执行查询,被成为Query DSL。

image-20220416174516191

上述搜索表明:query指明了查询定义是什么,匹配部分是想要运行的查询类型,match_all表示搜索指定索引中的所有文档,也可以传递其他参数来影响搜索结果,不指定size,默认值是10

image-20220416174812504

搜索文档
  1. 返回特定字段

    image-20220416175107628

  2. 匹配查询

    atch query的查询,它可以被视为基本的字段化搜索查询(即针对特定字段或一组字段进行的搜索)

    以下查询只返回账户为20的一条数据

    image-20220416175301314

  3. 布尔查询

    布尔查询是指使用布尔逻辑的方式把基本的查询组合成复杂的查询。

    以下例子解读:

    • must子句指定文档被视为匹配项时必须为真的所有查询:地址中必须同时包括词mill和lane。

    image-20220416175903758

    以下例子解读:

    • should子句指定一个查询列表,其中任何一个查询为真,文档即被视为匹配,也就是只需满足其中一个条件即可。

    image-20220416180102778

    以下例子解读:

    • ust_not子句指定一个查询列表,其中任何一个查询都不能为真,文档才能被视为匹配。

    image-20220416180205016

    bool查询中同时组合must、should和must_not子句;还可以在这些bool子句中嵌套bool查询,以模拟任何复杂的多级布尔逻辑。(太复杂了,我是不会)

    欺负老实人吗

  4. 条件过滤

    导入的数据中有个 balance字段(返回余额),请看下面的例子:

    • 找到余额大于或等于20000且小于或等于30000的账户

    • bool查询包含一个match_all查询(查询部分)和一个range查询(过滤部分)。可以将任何其他查询替换为查询和过滤部分。在上述情况下,范围查询是完全有意义的,因为属于范围的文档都是“相等”匹配的,即没有文档比其他文档更相关。

      image-20220416181524330

  5. 聚合查询

    聚合(aggregation)提供了对数据分组和提取统计信息的能力。聚合功能可以理解为大致等同于SQL中的Group By和SQL聚合函数的功能。在Elasticsearch

    中,可以执行返回命中文档的搜索,同时返回与搜索结果分离的聚合结果。从某种意义上说,这是非常强大和高效的,可以同时运行和查询多个聚合,并一次

    性获得两个(或多个)操作的结果,避免使用单一的API进行多次网络往返。

    请看下面例子:

    • size=0,表示不显示搜索结果,在响应中看到聚合结果。

    image-20220416181918412

总得来说,得益于REST风格的API,使用上非常简单,我们无需知道内部的任何逻辑,直接拿来用就行

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Elasticsearch 笔记 的相关文章

随机推荐

  • 公司网络慢如何解决,怎样诊断网络卡的原因

    企业局域网由于网络环境复杂 终端数量 设备数量都比较多 经常会出现网络卡顿等故障 一旦网络变慢时 面对复杂的网络环境 网管技术人员需要迅速并且准确的诊断出问题所在 并且加以解决 本文中 我将尽量描述网络变卡变慢的常见原因以及诊断方法 大体来
  • JAVA后端部署项目三步走

    1 JAVA部署项目三步走 1 1 查看 运行的端口 lsof i 8804 8804 为端口 发现端口25111被监听 1 2 杀死进程 终止程序 pid 为进程号 kill 9 pid 1 3 后台运行jar包 nohup java j
  • 网上书城前端界面

    前言 1 用户登录注册界面编写 2 前台主界面编写 3 搜索书籍界面编写 4 购物车界面编写 接下来就上代码了 注册界面
  • pixel手机救砖教程

    Pixel救砖教程 所谓救砖 就是你手机开不了机了 故障了 俗称 砖 如果你舍不得仍了重换 那么就需要救砖 9008深刷我没用过 所以如果你需要用9008深刷 请去别处找教程 直接进入正题 救砖 准备工具 电脑一台 线一条 一部快废了的pi
  • 滤波电容的大小的选取

    印制板中有接触器 继电器 按钮等元件时 操作它们时均会产生较大火花放电 必须采用RC吸收电路来吸收放电电流 一般R取1 2k C取2 2 4 7 F 一般的10PF左右的电容用来滤除高频的干扰信号 0 1UF左右的用来滤除低频的纹波干扰 可
  • 【C++】基类析构函数报错 LNK2001 无法解析的外部符号

    bug 情况说明 在基类没有显式析构函数的时候 不会报错 添加了显式析构函数就会报错 LNK2001 无法解析的外部符号 记录下该 bug 的修改要点 基类 显示析构函数 声明需要用 虚函数 virtual BaseClass 基类 需要添
  • (android地图开发) 高德地图自定义标题栏

    截图效果 布局文件
  • Axios的二次,三次封装

    import axios from axios import showToast from vant 这里是引入的组价库 做提示用 import vant es toast style 组件库样式 import router from ro
  • -bash: nginx: command not found 解决方案

    楼主已经安装了Nginx在Linux下面 然后也把Nginx启动了 此时想重新加载一下Nginx 然后输入命令 居然发生了下面的错误 我的Linux系统是 centos 6 5 的 root zxc sbin nginx s reload
  • vue-axios的总结及项目中的常见封装方法。

    前言 我们知道 vue 2 0版本开始推荐使用 axios 来完成前端 ajax 请求 axios 是一个基于Promise 的 http 库 可以用在浏览器和 node js 中 axios 成为vue全家桶的一个重要部分 对前后端接口请
  • Unity 四元数、欧拉角、轴角 之间的互相转换

    using UnityEngine public class RotateTest MonoBehaviour public Transform a public Transform b public Transform c void St
  • springboot整合微信扫码支付(详细)

    微信扫码支付 以下主要是针对微信支付V3接口进行的整合 且为Native支付 前期准备工作 1 获取微信相关数据 绑定支付的appid 商户id 商户支付秘钥wechatKey 这个需要V3的 证书序列号 私钥文件 pem文件 下面给出了相
  • Boost电压闭环控制及其仿真(PI控制)

    这是自己本科做的一项综合设计作业 自动控制理论的 课程作业题目是 DC DC升压变换单电压环控制器设计 我查了不少资料 硕士论文 文献等 断断续续地花了1个半月解决的 当时老师手中有两个作业 一个是Boost单电压闭环控制仿真 另外一个是B
  • llama2模型下载

    介绍 LLaMA 2 CHAT与OpenAI ChatGPT效果一样好 LLaMA 2与LLaMA 1架构相同 LLaMA 2训练数据是2000000000000个tokens 还是用了1000000个人类新标注的数据 上下文长度由2048
  • 前端实战复习——歌词滚动

    歌词滚动 此处展示为html的demo 思路 首先歌词单独为div 歌词整体滚动 设置wrap为div 歌词上移使用移动wrap位置 所以需要设置wrap position为absolute 歌词高亮使用当前歌词改变类名实现 添加过渡tra
  • C++ CopyFile函数的用法

    CopyFile函数定义在Windows h中 使用时要include之 CopyFile 使用如下 include
  • 一篇文章彻底学会递归思路解题

    一篇文章彻底学会递归思路解题 前 言 递归是算法中一种非常重要的思想 应用也很广 小到阶乘 再在工作中用到的比如统计文件夹大小 大到 Google 的 PageRank 算法都能看到 也是面试官很喜欢的考点 最近看了不少递归的文章 收获不小
  • blender硬表面建模渲染终极教程

    blender硬表面建模渲染终极教程 Gumroad The ULTIMATE Guide to Hard Ops and Boxcutter Gumroad 硬操作和切箱机的终极指南 教程大小 6G 1920X1080分辨率 语言 英语
  • 7-12 最长对称子串 (25 分)

    对给定的字符串 本题要求你输出最长对称子串的长度 例如 给定Is PAT TAP symmetric 最长对称子串为s PAT TAP s 于是你应该输出11 输入格式 输入在一行中给出长度不超过1000的非空字符串 输出格式 在一行中输出
  • Elasticsearch 笔记

    文章目录 Elasticsearch 快速安装 安装启动 问题踩坑 状态验证 Elasticsearch 基础使用 查看节点列表 列出索引信息 查看节点分片信息 其他的一些信息查询 创建索引 索引和查询文档 删除索引 修改数据 探索数据 搜