ElasticSearch 入门
作者:互联网 阅读次数:

Elasticsearch:简介

Elasticsearch(有时称为 ES)最初于 2010 年发布,是一种基于 Apache Lucene 的现代搜索和分析引擎。Elasticsearch 是用 Java 构建的,是一个 NoSQL 数据库。这意味着它以非结构化方式存储数据,您不能使用 SQL 来查询它。

此 Elasticsearch 教程也可以视为 NoSQL 教程。然而,与大多数 NoSQL 数据库不同,Elasticsearch 非常注重搜索功能和特性——事实上,从 ES 获取数据的最简单方法是使用广泛的 Elasticsearch API 进行搜索

在数据分析方面,Elasticsearch 与 ELK Stack、Logstash 和 Kibana 中的其他组件一起使用,起到数据索引和存储的作用。如今,Logstash 通常被更小、更轻量级的组件所取代,例如Fluentd 或 FluentBit——它们可以完成 Logstash 的大部分功能,而无需繁重的计算足迹和常见的挑战。

正如您将在本教程中看到的,开始使用 Elasticsearch 并不是火箭科学。尤其是在您设置小型集群时,实施 ELK 日志记录管道非常简单。

但是,一旦开始发送更多数据,ELK 管理就需要更多工作您将需要管理和扩展更大的集群,实施更多数据解析,安装和管理像 Kafka 这样的数据队列来缓冲您的日志,也许升级您的 ELK 组件,并监控和调整您的堆栈以解决性能问题。

对于那些不想自己管理这些任务并需要 RBAC 等额外功能的人,Logz.io 构建了一个日志管理工具,提供 ELK-as-a-service(现在是 OpenSearch-as-a-service!),这样您就可以拥抱世界领先的日志记录平台,而无需自己运行它。Logz.io 还支持度量和跟踪分析——在此处了解 Logz.io 统一和增强领先的开源可观察性技术的方式

总而言之,对于小型集群,自己运行 Elasticsearch 是一个不错的选择。让我们看看如何开始。

安装弹性搜索

Elasticsearch的要求很简单:Java 8(具体版本推荐:Oracle JDK version 1.8.0_131)。查看此Logstash 教程以确保您已准备就绪。此外,您需要确保您的操作系统在Elastic 支持矩阵中,否则您可能会遇到奇怪且不可预测的问题。完成后,您可以开始安装 Elasticsearch。

您可以下载 Elasticsearch作为独立发行版或使用aptyum存储库安装它。我们将在AWS EC2上运行的 Ubuntu 16.04 机器上使用apt.

首先,您需要添加 Elastic 的签名密钥,以便您可以验证下载的包(如果您已经从 Elastic 安装包,请跳过此步骤):

wget -qO - https://artifacts.elastic.co/gpg-key-elasticsearch | sudo apt-key 添加 -

复制

对于 Debian,我们需要安装软件包apt-transport-https

sudo apt-get 安装 apt-transport-https

复制

下一步是将存储库定义添加到您的系统:

echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-6.x.list

复制

剩下要做的就是更新您的存储库并安装 Elasticsearch:

sudo apt-get 更新sudo apt-get 安装 elasticsearch

复制

配置弹性搜索

Elasticsearch 配置是使用配置文件完成的,其位置取决于您的操作系统。在此文件中,您可以配置常规设置(例如节点名称),以及网络设置(例如主机和端口)、存储数据的位置、内存、日志文件等。

出于开发和测试目的,默认设置就足够了,但建议您研究一下在投入生产之前应该手动定义哪些设置。

例如,特别是如果在云上安装 Elasticsearch,将 Elasticsearch 绑定到私有 IP 或本地主机是一个很好的最佳实践:

sudo vim /etc/elasticsearch/elasticsearch.yml网络主机:“本地主机”http.端口:9200

复制

运行 Elasticsearch

Elasticsearch 安装后不会自动运行,需要手动启动。您如何运行 Elasticsearch 将取决于您的特定系统。在大多数基于 Linux 和 Unix 的系统上,您可以使用此命令:

sudo 服务 elasticsearch 启动

复制

就是这样!要确认一切正常,只需将 curl 或浏览器指向http://localhost:9200,您应该会看到类似以下的输出:

{
  “名称”:“33QdmXw”,
  “集群名称”:“弹性搜索”,
  “cluster_uuid”:“mTkBe_AlSZGbX-vDIe_vZQ”,
  “版本” : {
    “数字”:“6.1.2”,
    “build_hash”:“5b1fea5”,
    “build_date”:“2018-01-10T02:35:59.208Z”,
    “build_snapshot”:假的,
    “lucene_version”:“7.1.0”,
    “最低_wire_compatibility_version”:“5.6.0”,
    “最低_index_compatibility_version”:“5.0.0”
  },
  "tagline" : "You Know, for Search"}

复制

要调试运行 Elasticsearch 的过程,请使用位于(Deb 上)中的 Elasticsearch 日志文件/var/log/elasticsearch/

创建 Elasticsearch 索引

索引是将数据添加到 Elasticsearch 的过程。这是因为当您将数据输入 Elasticsearch 时,数据会被放入Apache Lucene索引中。这是有道理的,因为 Elasticsearch 使用 Lucene 索引来存储和检索其数据。尽管您不需要对 Lucene 了解很多,但是当您开始认真使用 Elasticsearch 时了解它的工作原理确实会有所帮助。
Elasticsearch 的行为类似于 REST API,因此您可以使用 或POST方法PUT向其添加数据。PUT当您知道或想要指定id数据项的时,或者如果您希望 Elasticsearch为数据项POST生成一个时,您可以使用:id

curl -XPOST 'localhost:9200/logs/my_app' -H 'Content-Type: application/json' -d'{
	"时间戳": "2018-01-24 12:34:56",
	"message": "用户登录",
	“用户 ID”:4,
	“管理员”:假}'curl -X PUT 'localhost:9200/app/users/4' -H 'Content-Type: application/json' -d '{
  “编号”:4,
  “用户名”:“约翰”,
  “last_login”:“2018-01-25 12:34:56”}'

复制

和回应:

{"_index":"logs","_type":"my_app","_id":"ZsWdJ2EBir6MIbMWSMyF","_version":1,"result":"created","_shards":{"total":2, “成功”:1,“失败”:0},“_seq_no”:0,“_primary_term”:1}{"_index":"app","_type":"users","_id":"4","_version":1,"result":"created","_shards":{"total":2, “成功”:1,“失败”:0},“_seq_no”:0,“_primary_term”:1}

复制

文档的数据作为 JSON 对象发送。您可能想知道我们如何在不定义数据结构的情况下索引数据。好吧,与任何其他 NoSQL 数据库一样,使用 Elasticsearch 不需要事先定义数据的结构。不过,为确保最佳性能,您可以根据数据类型定义 Elasticsearch 映射。稍后会详细介绍。

如果您使用任何 Beats shippers(例如 Filebeat 或 Metricbeat)或 Logstash,ELK Stack 的这些部分将自动创建索引。

要查看 Elasticsearch 索引列表,请使用:

curl -XGET 'localhost:9200/_cat/indices?v&pretty'健康状态索引 uuid pri rep docs.count docs.deleted store.size pri.store.size黄色打开 logstash-2018.01.23 y_-PguqyQ02qOqKiO6mkfA 5 1 17279 0 9.9mb 9.9mb黄色打开应用程序 GhzBirb-TKSUFLCZTCy-xg 5 1 1 0 5.2kb 5.2kb黄色打开 .kibana Vne6TTWgTVeAHCSgSboa7Q 1 1 2 0 8.8kb 8.8kb黄色打开日志 T9E6EdbMSxa8S_B7SDabTA 5 1 1 0 5.7kb 5.7kb

复制

本例中的列表包括我们在上面创建的索引、一个 Kibana 索引和一个由 Logstash 管道创建的索引。

弹性搜索查询

一旦将数据索引到 Elasticsearch 中,就可以开始搜索和分析数据。您可以执行的最简单的查询是获取单个项目。阅读我们专门关注Elasticsearch 查询的文章。

再一次,通过 Elasticsearch REST API,我们使用GET

curl -XGET 'localhost:9200/app/users/4?pretty'

复制

和回应:

{
  “_index”:“应用程序”,
  “_type”:“用户”,
  “_id”:“4”,
  “_版本”:1,
  “发现”:真实,
  “_来源” : {
    “编号”:4,
    “用户名”:“约翰”,
    “last_login”:“2018-01-25 12:34:56”
  }}

复制

以下划线开头的字段都是结果的元字段。_source对象是被索引的原始文档。
我们还使用 GET 通过调用端点进行搜索_search

curl -XGET 'localhost:9200/_search?q=logged'{"took":173,"timed_out":false,"_shards":{"total":16,"successful":16,"skipped":0,"failed":0},"hits":{"total ":1,"max_score":0.2876821,"hits":[{"_index":"logs","_type":"my_app","_id":"ZsWdJ2EBir6MIbMWSMyF","_score":0.2876821,"_source":{
    "时间戳": "2018-01-24 12:34:56",
    "message": "用户登录",
    “用户 ID”:4,
    “管理员”:假}}]}}

复制

结果包含许多描述搜索和结果的额外字段。这是一个简要的概述:

  • took:搜索花费的时间(以毫秒为单位)

  • timed_out: If the search timed out

  • _shards:搜索到的Lucene分片数量,以及成功率和失败率

  • hits:实际结果,以及结果的元信息

我们在上面进行的搜索称为URI 搜索,是查询 Elasticsearch 的最简单方法。通过仅提供一个词,ES 将在所有文档的所有字段中搜索该词。您可以使用Lucene 查询构建更具体的搜索:

  • username:johnb – 查找用户名字段等于“johnb”的文档

  • john* – 查找包含以 john 开头且后跟零个或多个字符(例如“john”、“johnb”和“johnson”)的术语的文档

  • 约翰?– 查找包含以 john 开头且仅后跟一个字符的术语的文档。匹配“johnb”和“johns”但不匹配“john”。

还有许多其他搜索方法,包括使用布尔逻辑、词条提升、模糊和邻近搜索的使用以及正则表达式的使用。

弹性搜索查询 DSL

URI 搜索只是一个开始。Elasticsearch 还提供带有查询 DSL 的请求主体搜索,用于更高级的搜索。在这些类型的搜索中有大量可用的选项,您可以混合搭配不同的选项以获得所需的结果。

它包含两种子句:1) 在特定字段中查找值的叶查询子句,以及 2) 复合查询子句(可能包含一个或多个叶查询子句)。

Elasticsearch 查询类型

在这些类型的搜索中有大量可用的选项,您可以混合搭配不同的选项以获得所需的结果。查询类型包括:

  1. 地理查询,

  2. “更像这样”的查询

  3. 脚本查询

  4. 全文查询

  5. 形状查询

  6. 跨度查询

  7. 术语级查询

  8. 专业查询

从 Elasticsearch 6.8 开始,ELK Stack 已经合并了 Elasticsearch query 和 Elasticsearch filters,但 ES 仍然通过上下文来区分它们。DSL 区分过滤上下文和查询子句的查询上下文过滤器上下文中的子句以布尔方式测试文档:文档是否匹配过滤器,“是”或“否”?过滤器通常也比查询更快,但查询也可以根据文档与查询的匹配程度来计算相关性分数。过滤器不使用相关性分数。这决定了文档的排序和包含:

curl -XGET 'localhost:9200/logs/_search?pretty' -H 'Content-Type: application/json' -d'{
  “询问”: {
    “匹配短语”:{
      "message": "用户登录"
    }
  }}'

复制

结果:

{
  “花了”:28,
  “超时”:假的,
  “_碎片”:{
    “总计”:5,
    “成功”:5,
    “跳过”:0,
    “失败”:0
  },
  “命中”:{
    “总计”:1,
    “最大分数”:0.8630463,
    “命中”:[
      {
        “_index”:“日志”,
        “_type”:“我的应用程序”,
        “_id”:“ZsWdJ2EBir6MIbMWSMyF”,
        “_分数”:0.8630463,
        “_来源” : {
          “时间戳”:“2018-01-24 12:34:56”,
          "message" : "用户登录",
          “用户 ID”:4,
          “管理员”:假
        }
      }
    ]
  }}'

复制

创建弹性搜索集群

维护一个 Elasticsearch 集群可能很耗时,尤其是当你在做 DIY ELK 的时候。但是,考虑到 Elasticsearch 强大的搜索和分析能力,这样的集群是必不可少的。我们通过Elasticsearch 集群教程对这个主题进行了更深入的研究,因此我们将以此为跳板进行更彻底的演练。

究竟什么是 Elasticsearch 集群?Elasticsearch 集群将多个 Elasticsearch 节点和/或实例组合在一起。当然,您始终可以选择在给定集群中维护单个 Elasticsearch 实例或节点。这种分组的要点在于集群在其节点上的任务分布、搜索和索引。节点选项包括数据节点、主节点、客户端节点和摄取节点。

安装节点可能涉及很多配置,我们前面提到的教程涵盖了这些配置。但这里是基本的 Elasticsearch 集群节点安装:

首先,安装 Java:

sudo apt-get install default-jre

复制

接下来,添加 Elasticsearch 的登录密钥:

wget -qO - https://artifacts.elastic.co/gpg-key-elasticsearch | sudo apt-key 添加 -

复制

接下来,安装 Elasticsearch 的新版本:

sudo apt-get update && apt-get install elasticsearch

复制

您必须创建和/或设置每个 Elasticsearch 节点自己的elasticsearch.yml配置文件 ( sudo vim /etc/elasticsearch/elasticsearch.yml)。从那里启动 Elasticsearch,然后检查您的 Elasticsearch 集群状态。响应看起来像这样:

{  “cluster_name”:“elasticsearch-cluster-demo”,  “compressed_size_in_bytes”:255,  “版本”:7,  “state_uuid”:“50m3ranD0m54a531D”,  “master_node”:“IwEK2o1-Ss6mtx50MripkA”,  “块”:{},  “节点”:{    “m4-aw350m3-n0D3”:{      “名称”:“es-node-1”,      “ephemeral_id”:“x50m33F3mr--A11DnuM83r”,      “传输地址”:“172.31.50.123:9200”,      “属性” : { }    },  },}

复制

Elasticsearch 集群健康将是您列表中的下一个。使用以下 API 调用定期检查集群的运行状况:

curl -X GET "localhost:9200/_cluster/health?wait_for_status=yellow&local=false&level=shards&pretty"

复制

此示例将参数显示localfalse,(实际上是默认设置)。这将向您显示主节点的状态。要检查本地节点,请更改为true

默认情况下,级别参数将向您显示集群健康状况,但排名超出该范围包括indicesshards(如上例所示)。

超时还有其他可选参数......

timeout
master_timeout

……或者,等待某些事件发生:

wait_for_active_shards
wait_for_events
wait_for_no_initializing_shards
wait_for_no_relocating_shards
wait_for_nodes
wait_for_status

当然,使用 Logz.io,创建 Elasticsearch(现在是 OpenSearch)集群就像开始免费试用一样简单。扩展您的 Elasticsearch 集群不需要用户任何帮助。

删除 Elasticsearch 数据

从 Elasticsearch 中删除项目与将数据输入 Elasticsearch 一样简单。这次使用的 HTTP 方法是——惊奇,惊奇—— DELETE

$ curl -XDELETE 'localhost:9200/app/users/4?pretty'{
  “_index”:“应用程序”,
  “_type”:“用户”,
  “_id”:“4”,
  “_版本”:2,
  “结果”:“已删除”,
  “_碎片”:{
    “总计”:2,
    “成功”:1,
    “失败”:0
  },
  “_seq_no”:1,
  “_primary_term”:1}

复制

要删除索引,请使用:

$ curl -XDELETE 'localhost:9200/logs?pretty'

复制

要删除所有索引(请谨慎使用),请使用:

$ curl -XDELETE 'localhost:9200/_all?pretty'$

复制

两种情况下的响应应该是:

{ “确认”:真实}

复制

要删除单个文档:

$ curl -XDELETE 'localhost:9200/index/type/document'


返回列表

扫码关注不迷路!!!

郑州升龙商业广场B座25层

service@iqiqiqi.cn

企起期科技 qiqiqi

联系电话:400-8049-474

联系电话:187-0363-0315

联系电话:199-3777-5101