Elasticsearch 入门

目录

Elasticsearch 入门

启动并运行 Elasticsearch 

在 Elastic Cloud 上运行 Elasticsearch

在 Linux、macOS 或 Windows 上本地运行 Elasticsearch

使用 cURL 命令与 Elasticsearch 对话

其他安装选项

索引文档

批量索引文档

开始搜索

使用聚合分析结果


Elasticsearch 入门

准备好试用 Elasticsearch 并亲自了解如何使用 REST API 来存储、搜索和分析数据了吗?

逐步完成本入门教程以:

  1. 启动并运行 Elasticsearch 集群
  2. 索引一些示例文档
  3. 使用 Elasticsearch 查询语言搜索文档
  4. 使用存储桶和指标聚合分析结果

需要更多上下文?

查看Elasticsearch 简介以了解术语并了解 Elasticsearch 工作原理的基础知识。如果已经熟悉 Elasticsearch 并想了解它如何与堆栈的其余部分一起工作,可以跳到 Elastic Stack 教程以了解如何使用 Elasticsearch、Kibana、Beats 和日志存储。

Tips:开始使用 Elasticsearch 的最快方法是 在云中免费试用 Elasticsearch Service 14 天。 

启动并运行 Elasticsearch 

要试用 Elasticsearch,可以 在 Elasticsearch 服务上创建 托管部署或在您自己的 Linux、macOS 或 Windows 机器上设置多节点 Elasticsearch 集群。

在 Elastic Cloud 上运行 Elasticsearch

当您在 Elasticsearch 服务上创建部署时,该服务会预配一个三节点 Elasticsearch 集群以及 Kibana 和 APM。

创建部署:

  1. 注册免费试用 并验证您的电子邮件地址。
  2. 为您的帐户设置密码。
  3. 单击创建部署

创建部署后,您就可以为某些文档编制索引了

在 Linux、macOS 或 Windows 上本地运行 Elasticsearch

在 Elasticsearch 服务上创建部署时,会自动供应一个主节点和两个数据节点。通过从 tar 或 zip 存档安装,您可以在本地启动多个 Elasticsearch 实例以查看多节点集群的行为。

在本地运行三节点 Elasticsearch 集群:

  1. 下载适用于您的操作系统的 Elasticsearch 安装文件:

    Linux:elasticsearch-7.6.2-linux-x86_64.tar.gz

curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.6.2-linux-x86_64.tar.gz

        macOS: elasticsearch-7.6.2-darwin-x86_64.tar.gz

curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.6.2-darwin-x86_64.tar.gz

        Windows: elasticsearch-7.6.2-windows-x86_64.zip

    2.解压归档包:

        Linux:

tar -xvf elasticsearch-7.6.2-linux-x86_64.tar.gz

        macOS:

tar -xvf elasticsearch-7.6.2-darwin-x86_64.tar.gz

        Windows PowerShell:

Expand-Archive elasticsearch-7.6.2-windows-x86_64.zip

    3.从bin目录启动 Elasticsearch :

        Linux 和 macOS:

cd elasticsearch-7.6.2/bin
./elasticsearch

        Windows:

cd elasticsearch-7.6.2\bin
.\elasticsearch.bat

        现在已经启动并运行了一个单节点 Elasticsearch 集群!

    4.再启动两个 Elasticsearch 实例,这样就可以看到典型的多节点集群的行为方式。需要为每个节点指定唯一的数据和日志路径。

        Linux 和 macOS:

./elasticsearch -Epath.data=data2 -Epath.logs=log2
./elasticsearch -Epath.data=data3 -Epath.logs=log3

        Windows:

.\elasticsearch.bat -E path.data=data2 -E path.logs=log2
.\elasticsearch.bat -E path.data=data3 -E path.logs=log3

       额外的节点被分配了唯一的 ID。由于在本地运行所有三个节点,因此它们会自动与第一个节点一起加入集群。

5.使用 cat health API 验证三节点集群是否已启动。cat API 以比原始 JSON 更易于阅读的格式返回有关集群和索引的信息。

也可以通过向 Elasticsearch REST API 提交 HTTP 请求来直接与集群交互。如果已安装并运行 Kibana,还可以打开 Kibana 并通过开发控制台提交请求。

Tips:当需要在自己的应用程序中使用 Elasticsearch 时,可以查看 Elasticsearch 语言客户端

GET /_cat/health?v

响应应该表明elasticsearch集群的状态是green并且它有三个节点:

epoch      timestamp cluster       status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1565052807 00:53:27  elasticsearch green           3         3      6   3    0    0        0             0                  -                100.0%

Note:如果只运行 Elasticsearch 的单个实例,集群状态将保持为黄色。单节点集群功能齐全,但无法将数据复制到另一个节点以提供弹性。要使集群状态为绿色,副本分片必须可用。如果集群状态为红色,则部分数据不可用。

使用 cURL 命令与 Elasticsearch 对话

本指南中的大多数示例能够复制适当的 cURL 命令并将请求从命令行提交到本地 Elasticsearch 实例。

对 Elasticsearch 的请求与HTTP 请求组成部分相同:

curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'

此示例使用以下变量:

<VERB>

适当的 HTTP 方法或动词。例如,GETPOST, PUTHEAD,或DELETE

<PROTOCOL>

无论是httphttps。如果在 Elasticsearch 前面有一个 HTTPS 代理,或者使用 Elasticsearch 安全功能来加密 HTTP 通信,请使用https

<HOST>

Elasticsearch 集群中任何节点的主机名。或者localhost用于本地计算机上的节点。

<PORT>

运行 Elasticsearch HTTP 服务的端口,默认为9200.

<PATH>

API 端点,可以包含多个组件,例如 _cluster/stats_nodes/stats/jvm

<QUERY_STRING>

任何可选的查询字符串参数。例如,?pretty 将 JSON 响应以更易于阅读的格式展示。

<BODY>

JSON 编码的请求正文(如有必要)。

如果启用了 Elasticsearch 安全功能,还必须提供有权运行 API 的有效用户名(和密码)。例如,使用 -u或者 --u cURL 命令参数。有关运行每个 API 需要哪些安全权限的详细信息,请参阅REST API

Elasticsearch 使用 HTTP 状态代码响应每个 API 请求,例如200 OK. 除了HEAD请求之外,它还返回一个 JSON 编码的响应正文。

其他安装选项

从存档文件安装 Elasticsearch 可以轻松地在本地安装和运行多个实例。要运行单个实例,可以在 Docker 容器中运行 Elasticsearch,在 Linux 上使用 DEB 或 RPM 包安装 Elasticsearch,在 macOS 上使用 Homebrew 安装,或在 Windows 上使用 MSI 包安装程序安装。有关更多信息,请参阅安装 Elasticsearch

索引文档

一旦集群启动并运行,就可以为一些数据建立索引了。Elasticsearch 有多种选项,但最终它们都做同样的事情:将 JSON 文档放入 Elasticsearch 索引中。

可以使用简单的 PUT 请求直接执行此操作,该请求指定要添加文档的索引、唯一文档 ID 以及请求正文中的一对或多对"field": "value"

PUT /customer/_doc/1
{
  "name": "John Doe"
}

如果customer索引不存在,此请求会自动创建索引,添加一个 ID 为 1的新文档,并存储和索引该name字段。

由于这是一个新文档,响应显示操作的结果是创建了文档的版本 1:

{
  "_index" : "customer",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 2,
    "failed" : 0
  },
  "_seq_no" : 26,
  "_primary_term" : 4
}

新文档可立即从集群中的任何节点获得。可以使用指定其文档 ID 的 GET 请求来检索它:

GET /customer/_doc/1

响应表明找到了具有指定 ID 的文档并显示了已编入索引的原始源字段。

{
  "_index" : "customer",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "_seq_no" : 26,
  "_primary_term" : 4,
  "found" : true,
  "_source" : {
    "name": "John Doe"
  }
}

批量索引文档

如果有大量文档需要索引,可以使用批量 API批量提交它们。使用批量索引来批处理文档操作比单独提交请求要快得多,因为它最大限度地减少了网络往返。

最佳批量大小取决于许多因素:文档大小和复杂性、索引和搜索负载以及集群可用的资源。比较好的起点是批量处理 1,000 到 5,000 个文档,总负载在 5MB 到 15MB 之间。以此可以尝试找到最佳位置。

要将一些数据输入 Elasticsearch,可以开始搜索和分析:

  1. 下载accounts.json示例数据集。这个随机生成的数据集中的文档代表具有以下信息的用户帐户:

{
    "account_number": 0,
    "balance": 16623,
    "firstname": "Bradshaw",
    "lastname": "Mckenzie",
    "age": 29,
    "gender": "F",
    "address": "244 Columbus Place",
    "employer": "Euron",
    "email": "bradshawmckenzie@euron.com",
    "city": "Hobucken",
    "state": "CO"
}

        2. 使用以下_bulk请求将帐户数据索引到bank索引中:

curl -H "Content-Type: application/json" -XPOST "localhost:9200/bank/_bulk?pretty&refresh" --data-binary "@accounts.json"
curl "localhost:9200/_cat/indices?v"

        响应表明已成功索引 1,000 个文档。

health status index uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   bank  l7sSYV2cQXmu6_4rJWVIww   5   1       1000            0    128.6kb        128.6kb

开始搜索

一旦将一些数据存放到 Elasticsearch 索引中,就可以通过向_search端点发送请求来搜索它。要访问全套搜索功能,可以使用 Elasticsearch Query DSL 在请求正文中指定搜索条件。在请求 URI 中指定要搜索的索引的名称。

例如,以下请求检索bank 索引中按帐号排序的所有文档:

GET /bank/_search
{
  "query": { "match_all": {} },
  "sort": [
    { "account_number": "asc" }
  ]
}

默认情况下,hits响应的部分包括与搜索条件匹配的前 10 个文档:

{
  "took" : 63,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
        "value": 1000,
        "relation": "eq"
    },
    "max_score" : null,
    "hits" : [ {
      "_index" : "bank",
      "_type" : "_doc",
      "_id" : "0",
      "sort": [0],
      "_score" : null,
      "_source" : {"account_number":0,"balance":16623,"firstname":"Bradshaw","lastname":"Mckenzie","age":29,"gender":"F","address":"244 Columbus Place","employer":"Euron","email":"bradshawmckenzie@euron.com","city":"Hobucken","state":"CO"}
    }, {
      "_index" : "bank",
      "_type" : "_doc",
      "_id" : "1",
      "sort": [1],
      "_score" : null,
      "_source" : {"account_number":1,"balance":39225,"firstname":"Amber","lastname":"Duke","age":32,"gender":"M","address":"880 Holmes Lane","employer":"Pyrami","email":"amberduke@pyrami.com","city":"Brogan","state":"IL"}
    }, ...
    ]
  }
}

响应还提供有关搜索请求的以下信息:

  • took – Elasticsearch 运行查询需要多长时间,以毫秒为单位
  • timed_out – 搜索请求是否超时
  • _shards – 搜索了多少个分片以及成功、失败或跳过了多少分片的明细。
  • max_score – 找到的最相关文档的分数
  • hits.total.value - 找到了多少匹配的文件
  • hits.sort - 文档的排序位置(当不按相关性分数排序时)
  • hits._score- 文档的相关性分数(使用时不适用match_all

每个搜索请求都是独立的:Elasticsearch 不会跨请求维护任何状态信息。要分页查询,可在请求中指定fromsize参数。

例如,以下请求的命中为 10 到 19:

GET /bank/_search
{
  "query": { "match_all": {} },
  "sort": [
    { "account_number": "asc" }
  ],
  "from": 10,
  "size": 10
}

现在已经了解了如何提交基本搜索请求,可以开始构建比match_all更有趣的查询请求了.

要在字段中搜索特定术语,您可以使用match查询。例如,以下请求搜索address字段以查找地址包含milllane的客户:

GET /bank/_search
{
  "query": { "match": { "address": "mill lane" } }
}

要执行短语搜索而不是匹配单个术语,请使用 match_phrase代替match。例如,以下请求仅匹配包含短语mill lane的地址:

GET /bank/_search
{
  "query": { "match_phrase": { "address": "mill lane" } }
}

要构造更复杂的查询,可以使用一个bool查询来组合多个查询条件。可以根据需要(必须匹配)、希望(应该匹配)或不希望(必须不匹配)指定条件。

例如,以下请求在bank索引中搜索 40 岁客户的帐户,但排除居住在爱达荷州 (ID) 的任何人:

GET /bank/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "age": "40" } }
      ],
      "must_not": [
        { "match": { "state": "ID" } }
      ]
    }
  }
}

布尔查询中的每个mustshouldmust_not元素称为查询子句。文档满足每个must或 should条款中的标准的程度会影响文档的相关性得分。分数越高,文档就越符合搜索条件。默认情况下,Elasticsearch 返回按这些相关性分数排名的文档。

must_not子句中的条件被视为过滤器。它会影响文档是否包含在结果中,但不会影响文档的评分方式。还可以明确指定任意过滤器以包含或排除基于结构化数据的文档。

例如,以下请求使用范围过滤器将结果限制为余额在 20,000 元到 30,000 元(含)之间的帐户。

GET /bank/_search
{
  "query": {
    "bool": {
      "must": { "match_all": {} },
      "filter": {
        "range": {
          "balance": {
            "gte": 20000,
            "lte": 30000
          }
        }
      }
    }
  }
}

使用聚合分析结果

Elasticsearch 聚合能够获取有关搜索结果的元信息并回答诸如“四川省有多少帐户持有人?”或“广东省账户的平均账户余额是多少?”之类的问题。可以在一个请求中搜索文档、过滤匹配项并使用聚合来分析结果。

例如,以下请求使用terms聚合将bank索引中的所有帐户按省份分组,并按降序返回帐户最多的十个省份:

GET /bank/_search
{
  "size": 0,
  "aggs": {
    "group_by_state": {
      "terms": {
        "field": "state.keyword"
      }
    }
  }
}

响应中的bucketsstate字段的值。 doc_count展示了每个州的帐户数量。例如,可以看到ID(爱达荷州)有 27 个帐户。因为请求集size=0,所以响应只包含聚合结果。

{
  "took": 29,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped" : 0,
    "failed": 0
  },
  "hits" : {
     "total" : {
        "value": 1000,
        "relation": "eq"
     },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "group_by_state" : {
      "doc_count_error_upper_bound": 20,
      "sum_other_doc_count": 770,
      "buckets" : [ {
        "key" : "ID",
        "doc_count" : 27
      }, {
        "key" : "TX",
        "doc_count" : 27
      }, {
        "key" : "AL",
        "doc_count" : 25
      }, {
        "key" : "MD",
        "doc_count" : 25
      }, {
        "key" : "TN",
        "doc_count" : 23
      }, {
        "key" : "MA",
        "doc_count" : 21
      }, {
        "key" : "NC",
        "doc_count" : 21
      }, {
        "key" : "ND",
        "doc_count" : 21
      }, {
        "key" : "ME",
        "doc_count" : 20
      }, {
        "key" : "MO",
        "doc_count" : 20
      } ]
    }
  }
}

可以组合聚合来构建更复杂的数据摘要。例如,以下请求在前一个聚合group_by_state中内嵌一个avg聚合, 以计算每个省份的平均账户余额。

GET /bank/_search
{
  "size": 0,
  "aggs": {
    "group_by_state": {
      "terms": {
        "field": "state.keyword"
      },
      "aggs": {
        "average_balance": {
          "avg": {
            "field": "balance"
          }
        }
      }
    }
  }
}

可以通过指定terms聚合内的顺序来使用嵌套聚合的结果进行排序,而不是按计数对结果进行排序:

GET /bank/_search
{
  "size": 0,
  "aggs": {
    "group_by_state": {
      "terms": {
        "field": "state.keyword",
        "order": {
          "average_balance": "desc"
        }
      },
      "aggs": {
        "average_balance": {
          "avg": {
            "field": "balance"
          }
        }
      }
    }
  }
}

除了像这样的基本存储桶和指标聚合之外,Elasticsearch 还提供专门的聚合来操作多个字段并分析特定类型的数据,例如日期、IP 地址和地理数据。还可以将单个聚合的结果提供给管道聚合以供进一步分析。

聚合提供的核心分析功能支持使用机器学习来检测异常等高级功能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值