Elasticsearch 笔记 |快速使用

Posted 小鲸鱼大梦想

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Elasticsearch 笔记 |快速使用相关的知识,希望对你有一定的参考价值。

文章目录

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

安装启动

官网下载对应版本的软件包: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

  • 下载安装包:

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

  • 解压安装包:
# 把软件包放在/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			

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

  • 重要的目录结构

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

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

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

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

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

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

问题踩坑

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

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

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

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

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

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

状态验证

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

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

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

  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

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

列出索引信息

列出环境中的索引信息: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
# 以下表示集群中还没有索引

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

查看节点分片信息

显示每个节点的分片信息: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

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

其他的一些信息查询

除以上常用的之外,还提供了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个文档(默认的规则)
# 为什么会是黄色状态:默认分片有一个副本,但是副本为了高可用,是不能和主分片在一个节点上的,且只有一个节点运行,所以健康状态是黄色的

索引和查询文档

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

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

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

删除索引

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

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

修改数据

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

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

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

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

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

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

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

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

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

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

探索数据

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

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

搜索API

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

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

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

部分数据结果如下:

另一种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结果。

结果说明:

  • 第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。

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

搜索文档

  1. 返回特定字段

  2. 匹配查询

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

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

  3. 布尔查询

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

    以下例子解读:

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

    以下例子解读:

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

    以下例子解读:

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

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

  4. 条件过滤

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

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

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

  5. 聚合查询

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

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

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

    请看下面例子:

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

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

以上是关于Elasticsearch 笔记 |快速使用的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch 笔记 |快速使用

渣渣菜鸡为什么要看 ElasticSearch 源码?

elasticsearch 单节点搭建与爬坑记录

一文带您快速入门可视化分析平台 Kibana

ElasticSearch Python Client ReadTimeout 解决办法

ELK在广告系统监控中的应用 及 Elasticsearch简介