准备好使用Elasticsearch进行一次试驾,亲自看看如何使用rest api来存储、搜索和分析数据了吗?
逐步学习本入门教程:
1)启动并运行Elasticsearch群集
2)索引一些示例文档
3)使用Elasticsearch查询语言搜索文档
4)使用bucket和metrics聚合分析结果
需要更多的说明吗?
查看Elasticsearch的介绍,学习并了解Elasticsearch工作的基础知识。如果您已经熟悉了Elasticsearch并想了解它与堆栈的工作协同,那么您可能需要跳到Elastic Stack Tutorial教程,了解如何使用Elasticsearch、Kibana、Beats和Logstash设置系统监视解决方案。
最快使用Elasticsearch的方法是在云端试用14天免费的Elasticsearch服务。
要将Elasticsearch用作测试驱动器,可以在Elasticsearch服务上创建托管部署,或在自己的Linux、macOS或Windows计算机上设置多节点Elasticsearch群集。
在elasticcloudedit上运行Elasticsearch
在Elasticsearch服务上创建部署时,该服务将提供一个三节点Elasticsearch集群以及Kibana和APM。
请执行以下操作:
1)注册免费试用并验证您的电子邮件地址。
2)为您的帐户设置密码。
3)单击“创建”。
一旦创建了部署,就可以为一些文档编制索引了。
在Linux、macOS或Windowsedit上本地运行Elasticsearch
在Elasticsearch服务上创建服务时,将自动配置一个主节点和两个数据节点。通过从tar或zip压缩文档安装,您可以在本地启动多个Elasticsearch实例,以查看多节点集群的行为。
要在本地运行三节点Elasticsearch群集,请执行以下操作:
为您的操作系统下载Elasticsearch:
Linux: elasticsearch-7.9.0-linux-x86_64.tar.gz
curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.9.0-linux-x86_64.tar.gz
macOS: elasticsearch-7.9.0-darwin-x86_64.tar.gz
curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.9.0-darwin-x86_64.tar.gz
Windows: elasticsearch-7.9.0-windows-x86_64.zip
2、提取:
Linux系统:
tar -xvf elasticsearch-7.9.0-linux-x86_64.tar.gz
macOS系统:
tar -xvf elasticsearch-7.9.0-darwin-x86_64.tar.gz
Windows PowerShell:
Expand-Archive elasticsearch-7.9.0-windows-x86_64.zip
3、从bin目录启动Elasticsearch:
Linux和macOS:
cd elasticsearch-7.9.0/bin./elasticsearch
Windows:
cd elasticsearch-7.9.0\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 restapi提交HTTP请求,可以直接与集群交互。如果已经安装并运行Kibana,还可以打开Kibana并通过Dev控制台提交请求。
当您准备在自己的应用程序中开始使用Elasticsearch时,您需要检查一下Elasticsearch语言客户端。
GET /_cat/health?v
得到的响应应指示elasticsearch群集的状态为绿色,并且它有三个节点:
epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent1565052807 00:53:27 elasticsearch green 3 3 6 3 0 0 0 0 - 100.0%
如果您只运行Elasticsearch的单个实例,集群状态将保持黄色。单节点群集完全正常工作,但无法将数据复制到另一个节点以提供恢复能力。副本碎片必须可用才能使群集状态为绿色。如果群集状态为红色,则某些数据不可用。
用cURL命令和Elasticsearch进行交互
本指南中的大多数示例都允许您复制适当的cURL命令,并从命令行将请求提交到本地Elasticsearch实例。
Elasticsearch请求包含的部分与其他任何HTTP请求相同:
curl -X '://:/?' -d ''
此示例使用以下变量:
适当的HTTP方法或动词。例如,GET、POST、PUT、HEAD或DELETE。
http或https。如果在Elasticsearch前面有一个HTTPS代理,或者使用Elasticsearch安全特性来加密HTTP通信,请使用后者。
Elasticsearch群集中任何节点的主机名。或者,对本地计算机上的节点使用localhost。
运行Elasticsearch HTTP服务的端口,默认值为9200。
API端点,它可以包含多个组件,例如_cluster/stats或_nodes/stats/jvm。
任何可选的查询字符串参数。例如?pretty将漂亮地打印JSON响应以使其更易于阅读。
一旦集群启动并运行,就可以为一些数据编制索引了。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
}
新文档可以立即从群集中的任何节点获得。可以使用GET请求指定文档ID检索它:
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"
}
}
在bulkedit中索引文档
如果有很多文档需要索引,可以使用bulkapi批量提交它们。使用批量处理文档操作比单独提交请求要快得多,因为它最大限度地减少了网络往返。
最佳批处理大小取决于许多因素:文档大小和复杂性、索引和搜索负载以及集群可用的资源。一个好的起点是批量处理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": "[email protected]",
"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"
响应表明已成功索引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查询DSL在请求正文中指定搜索条件。在请求URI中指定要搜索的索引的名称。
例如,以下请求检索bank索引中的所有文档,按account_number排序。
GET /bank/_search{
"query": { "match_all": {} },
"sort": [
{ "account_number": "asc" }
]
}
默认情况下,响应的“命中”部分包括与搜索条件匹配的前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":"[email protected]","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":"[email protected]","city":"Brogan","state":"IL"}
}, ...
]
}
}
响应还提供有关搜索请求的以下信息:
1)took–Elasticsearch运行查询所用的时间(毫秒)
2)timed_out–搜索请求是否超时
3)_shards–搜索了多少碎片,以及成功、失败或跳过多少碎片。
4)max_score–找到的最相关文档的分数
5)hits.total.value-找到了多少匹配的文档
6)hits.sort-文档的排序位置(不按相关性得分排序时)
7)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更有趣的查询了。
要搜索字段中的特定术语,可以使用匹配查询。例如,以下请求搜索address字段以查找其地址包含mill或lane的客户:
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" } }
]
}
}
}
Bool查询中的每个must、should和must not元素被称为查询子句。文档满足每个must或should子句中的标准程度将影响文档的相关性得分。分数越高,文档就越符合您的搜索条件。默认情况下,ElasticScores按相关性返回这些文档。
must_not子句中的条件被视为筛选器。它影响文档是否包含在结果中,但不影响文档的评分方式。您还可以显式地指定任意筛选器以包含或排除结构化数据文档。
例如,下面的请求使用范围过滤器将结果限制为余额在20000到30000美元(包括20000美元)之间的帐户。
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"
}
}
}
}
响应中的bucket是state字段的值。doc_count显示每个状态下的帐户数。例如,您可以看到ID(爱达荷州)中有27个帐户。因为请求集大小=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聚合嵌套在前一个group_by_state聚合中,以计算每个状态的平均帐户余额。
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和metrics聚合,Elasticsearch还提供了专门的聚合,用于在多个字段上操作并分析特定类型的数据,如日期、IP地址和地理数据。您还可以将单个聚合的结果馈送到管道聚合中以供进一步分析。
聚合提供的核心分析功能支持高级功能,例如使用机器学习来检测异常。
现在,您已经设置了群集、索引了一些文档并运行了一些搜索和聚合,您可能需要:
1)进入Elastic Stack Tutorial 教程,安装Kibana、Logstash和Beats,并设置一个基本的系统监控解决方案。
2)将其中一个示例数据集加载到Kibana中,以了解如何将Elasticsearch和Kibana一起使用来可视化数据。
3)尝试一种 Elastic搜索解决方案:
网站搜索
应用程序搜索
企业搜索