ElasticSearch官方指南(二)——快速下载使用Elasticsearch

前言

准备好试用Elasticsearch了吗?让我们看看如何使用REST API去存储、搜索和分析数据!

通过本篇文章,我们可以学到:

  • 启动并运行Elasticsearch群集
  • 索引一些示例文档
  • 使用Elasticsearch查询语言搜索文档
  • 使用bucket和metrics聚合分析结果

通过我的第一篇文章了解清楚Elasticsearch语言,理解Elasticsearch工作的基本原理。如果我们已经熟悉Elasticsearch,并且希望了解它如何与堆栈的其余部分一起工作,那么我们可能希望跳转到Elastic堆栈教程,了解如何使用Elasticsearch、Kibana、Beats和Logstash来设置系统监视解决方案。

一、启动并运行Elasticsearch

做Elasticsearch的测试,我们可以在Elasticsearch服务上创建托管部署,或在自己的Linux、macOS或Windows计算机上设置多节点Elasticsearch群集。

在Elastic云上运行Elasticsearch

在Elasticsearch服务上创建部署时,该服务将提供一个三节点Elasticsearch集群以及Kibana和APM。

去创建一个部署:

  1. 注册免费试用并验证我们的电子邮件地址。
  2. 为你的账号设置一个密码。
  3. 点击创建部署。

一旦创建了部署,就可以为一些文档编制索引了。

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

在Elasticsearch服务上创建部署时,会自动设置一个主节点和两个数据节点。通过从tar或zip压缩文件安装,我们可以在本地启动多个Elasticsearch实例,以查看多节点集群的行为。

要在本地运行三节点Elasticsearch群集,请执行以下操作:

1、下载操作系统的Elasticsearch压缩文件:                                                                                             

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

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

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

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

     Windows: elasticsearch-7.12.0-windows-x86_64.zip

       2、解压缩文档

Linux:

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

macOS:

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

Windows PowerShell:

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

3、从bin目录开始Elasticsearch

Linux and macOS:

cd elasticsearch-7.12.0/bin
./elasticsearch

Windows:

cd elasticsearch-7.12.0\bin
.\elasticsearch.bat

我们现在有一个单节点Elasticsearch集群正在运行!

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

Linux and 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并通过Dev控制台提交请求。

当我们准备好在自己的应用程序中开始使用Elasticsearch时,我们需要查看Elasticsearch语言客户端。比如JAVA REST Client、.NET API等等。

GET /_cat/health?v=true

响应应指示elasticsearch群集的状态为绿色,并且它有三个节点:

epoch      timestamp cluster                          status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1618915823 10:50:23  9863b7c4eec147e7a9d3729354f68ec1 green           3         2     32  16    0    0        0             0                  -                100.0%

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

使用cURL命令与Elasticsearch交谈

本指南中的大多数示例都允许我们复制适当的cURL命令,并从命令行将请求提交到本地Elasticsearch实例。

对Elasticsearch的请求包含与一些HTTP请求相同的部分:

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

此示例使用以下变量:

<VERB>

适当的HTTP方法或动词。例如,GET、POST、PUT、HEAD或DELETE。

<PROTOCOL>

http或https。如果我们在Elasticsearch前面有一个HTTPS代理,或者我们使用Elasticsearch安全功能加密HTTP通信,请使用后者。

<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 APIS

其他安装选项

通过从压缩文件安装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"
}

如果客户索引不存在,此请求将自动创建该索引,添加一个ID为1的新文档,并存储名称字段并为其编制索引。

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

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

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

GET /customer/_doc/1

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

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

批量索引文档

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

最佳批量大小取决于许多因素:文档大小和复杂性、索引和搜索负载以及集群可用的资源。一个好的起点是批量处理1000到5000个文档,总负载在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、使用以下批量请求将帐户数据索引到银行索引中:

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

响应表明已成功索引1000个文档。

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中指定搜索的索引的名称。

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

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不在请求之间维护任何状态信息。要翻页浏览搜索结果,请在请求中指定from和size参数。

例如,以下请求的命中的数据位置为10到19:

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

既然我们已经了解了如何提交一个基本的搜索请求,那么就可以开始构造比match_all更有趣的查询了。

要在字段中搜索特定条件,可以使用match查询。例如,以下请求搜索包含mill或lane的address字段:

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

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

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

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

例如,以下请求在银行索引中搜索属于40岁客户的帐户,但不包括居住在爱达荷州(ID)的任何人:

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

布尔查询中的每个must、should和must not元素都称为查询子句。文档满足每个must或should子句中的标准的程度有助于文档的相关性得分。分数越高,文档就越符合我们的搜索条件。默认情况下,Elasticsearch返回按这些相关性得分排序的文档。

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

例如,以下请求使用范围筛选器将结果限制为余额在$20000和$30000(含)之间的帐户。

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

四、通过聚合分析结果

Elasticsearch聚合使我们能够获得有关搜索结果的元信息,并回答诸如“上海有多少帐户持有人?”或者“江苏省的平均账户余额是多少?”,我们可以在一个请求中搜索文档、过滤hits,并使用聚合来分析结果。

例如,以下请求使用terms聚合按状态对银行索引中的所有帐户进行分组,并按降序返回帐户最多的十个状态:

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

响应中的bucket是state字段的值。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
      } ]
    }
  }
}

我们可以合并聚合来构建更复杂的数据总结。例如,下面的请求在前一个组按状态聚合中嵌套一个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"
          }
        }
      }
    }
  }
}

除了这些基本的bucketing和度量聚合之外,Elasticsearch还提供了专门的聚合,用于操作多个字段和分析特定类型的数据,如日期、IP地址和地理数据。我们还可以将单个聚合的结果输入管道聚合以进行进一步分析。

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值