Elasticsearch参考[7.5]
原文链接:https://www.elastic.co/guide/en/elasticsearch/reference/7.5/index.html
Elasticsearch简介
Elasticsearch是Elastic Stack核心的分布式搜索和分析引擎。Logstash和Beats有助于收集,聚合和丰富您的数据并将其存储在Elasticsearch中。使用Kibana,您可以交互式地探索,可视化和共享对数据的见解,并管理和监视堆栈。Elasticsearch是建立索引,搜索和分析魔术的地方。
Elasticsearch为所有类型的数据提供实时搜索和分析。无论您是结构化文本还是非结构化文本,数字数据或地理空间数据,Elasticsearch都能以支持快速搜索的方式有效地对其进行存储和索引。您不仅可以进行简单的数据检索,还可以汇总信息来发现数据中的趋势和模式。随着数据和查询量的增长,Elasticsearch的分布式特性使您的部署可以随之无缝地增长。
虽然并非每个问题都是搜索问题,但是Elasticsearch可以提供速度和灵活性来处理各种用例中的数据:
- 将搜索框添加到应用或网站
- 存储和分析日志,指标和安全事件数据
- 使用机器学习自动实时建模数据行为
- 使用Elasticsearch作为存储引擎来自动化业务工作流程
- 使用Elasticsearch作为地理信息系统(GIS)管理,集成和分析空间信息
- 使用Elasticsearch作为生物信息学研究工具来存储和处理遗传数据
人们使用搜索的新颖方式使我们不断感到惊讶。但是,无论您的用例与其中之一相似,还是您正在使用Elasticsearch解决新问题,在Elasticsearch中处理数据,文档和索引的方式都是相同的。
数据输入:文档和索引
Elasticsearch是一个分布式文档存储。Elasticsearch不会将信息存储为列数据的行,而是存储已序列化为JSON文档的复杂数据结构。当集群中有多个Elasticsearch节点时,存储的文档会分布在整个集群中,并且可以从任何节点立即访问。
存储文档时,将在1秒内几乎实时地对其进行索引和完全搜索。Elasticsearch使用称为倒排索引的数据结构,该结构支持非常快速的全文本搜索。反向索引列出了出现在任何文档中的每个唯一单词,并标识了每个单词出现的所有文档。
索引可以认为是文档的优化集合,每个文档都是字段的集合,这些字段是包含数据的键值对。默认情况下,Elasticsearch对每个字段中的所有数据建立索引,并且每个索引字段都具有专用的优化数据结构。例如,文本字段存储在倒排索引中,数字字段和地理字段存储在BKD树中。使用按字段数据结构组合并返回搜索结果的能力使Elasticsearch如此之快。
Elasticsearch还具有无模式的能力,这意味着可以为文档建立索引,而无需明确指定如何处理文档中可能出现的每个不同字段。启用动态映射后,Elasticsearch自动检测并将新字段添加到索引。此默认行为使索引和浏览数据变得容易-只需开始建立索引文档,Elasticsearch就会检测布尔值,浮点数和整数值,日期和字符串并将其映射到适当的Elasticsearch数据类型。
但是,最终,您比Elasticsearch更了解您的数据以及如何使用它们。您可以定义规则以控制动态映射,并显式定义映射以完全控制字段的存储和索引方式。
定义自己的映射使您能够:
- 区分全文字符串字段和精确值字符串字段
- 执行特定于语言的文本分析
- 优化字段以进行部分匹配
- 使用自定义日期格式
- 无法自动检测到的 数据类型,例如geo_point和geo_shape
为不同的目的以不同的方式对同一字段建立索引通常很有用。例如,您可能希望将一个字符串字段索引为全文搜索的文本字段,以及作为排序或汇总数据的关键字字段。或者,您可能选择使用多个语言分析器来处理包含用户输入的字符串字段的内容。
在搜索时也会使用在索引期间应用于全文字段的分析链。当您查询全文字段时,对查询文本进行相同的分析,然后再在索引中查找术语。
信息输出:搜索和分析
虽然您可以将Elasticsearch用作文档存储并检索文档及其元数据,但真正的强大之处在于能够轻松访问基于Apache Lucene搜索引擎库构建的全套搜索功能。
Elasticsearch提供了一个简单,一致的REST API,用于管理您的集群以及索引和搜索数据。为了进行测试,您可以直接从命令行或通过Kibana中的开发者控制台轻松提交请求。在您的应用程序中,您可以将 Elasticsearch客户端 用于您选择的语言:Java,JavaScript,Go,.NET,PHP,Perl,Python或Ruby。
搜索数据
Elasticsearch REST API支持结构化查询,全文查询以及结合了两者的复杂查询。结构化查询类似于您可以在SQL中构造的查询类型。例如,您可以搜索索引中的gender和age字段,employee然后按hire_date字段对匹配项进行排序。全文查询会找到所有与查询字符串匹配的文档,并按相关性对它们进行归还-它们与您的搜索词的匹配程度如何。
除了搜索单个术语外,您还可以执行短语搜索,相似性搜索和前缀搜索,并获得自动完成建议。
是否要搜索地理空间或其他数字数据?Elasticsearch在支持高性能地理和数字查询的优化数据结构中索引非文本数据。
您可以使用Elasticsearch全面的JSON样式查询语言(Query DSL)访问所有这些搜索功能。您还可以构造SQL样式的查询,以在Elasticsearch内部本地搜索和聚合数据,并且JDBC和ODBC驱动程序使范围广泛的第三方应用程序可以通过SQL与Elasticsearch进行交互。
分析数据
Elasticsearch聚合使您能够构建数据的复杂摘要,并深入了解关键指标,模式和趋势。通过汇总,您不仅可以找到众所周知的“大海捞针”,还可以回答以下问题:
- 大海捞针有多少根?
- 针的平均长度是多少?
- 针头的中位长度是多少,由制造商细分?
- 在过去六个月的每个月中,有多少根针被添加到干草堆中?
您还可以使用聚合来回答更细微的问题,例如:
- 您最受欢迎的针头制造商是哪些?
- 是否有异常或异常的针团?
由于聚合利用了用于搜索的相同数据结构,因此它们也非常快。这使您可以实时分析和可视化数据。您的报告和仪表板会随着数据的更改而更新,因此您可以根据最新信息采取措施。
而且,聚合与搜索请求一起运行。您可以在单个请求中同时对相同数据搜索文档,过滤结果并执行分析。而且由于聚合是在特定搜索的上下文中计算的,因此您不仅显示了所有70针大小的针数,而且还显示了符合用户搜索条件的70针大小的针数-例如,所有尺寸的70 个不粘绣针。
但是等等,还有更多
是否想自动分析您的时间序列数据?您可以使用 机器学习功能在数据中创建正常行为的准确基准,并识别异常模式。通过机器学习,您可以检测到:
- 与值,计数或频率的时间偏差有关的异常
- 统计稀有度
- 人口成员的异常行为
最好的部分是?您无需指定算法,模型或其他与数据科学相关的配置即可执行此操作。
可扩展性和弹性:集群,节点和碎片
Elasticsearch旨在始终可用,并可以根据您的需求进行扩展。它是通过自然分布来实现的。您可以将服务器(节点)添加到集群以增加容量,Elasticsearch会自动在所有可用节点之间分配数据和查询负载。无需大修您的应用程序,Elasticsearch知道如何平衡多节点集群以提供扩展性和高可用性。节点越多越好。
这是如何运作的?在幕后,Elasticsearch索引实际上只是一个或多个物理碎片的逻辑分组,其中每个碎片实际上是一个独立的索引。通过在多个分片之间的索引中分配文档,并在多个节点之间分配这些分片,Elasticsearch可以确保冗余,这既可以防止硬件故障,又可以在将节点添加到集群中时提高查询能力。随着集群的增长(或收缩),Elasticsearch会自动迁移碎片以重新平衡集群。
分片有两种类型:主数据库和副本数据库。索引中的每个文档都属于一个主分片。副本分片是主分片的副本。副本可提供数据的冗余副本,以防止硬件故障并增加处理读取请求(如搜索或检索文档)的能力。
创建索引时,索引中主碎片的数量是固定的,但是副本碎片的数量可以随时更改,而不会中断索引或查询操作。
这取决于… …
在分片大小和为索引配置的主分片数量方面,存在许多性能方面的考虑和权衡取舍。分片越多,维护这些索引的开销就越大。分片大小越大,当Elasticsearch需要重新平衡集群时,分片移动所需的时间就越长。
查询很多小的分片会使每个分片的处理速度更快,但是更多的查询意味着更多的开销,因此查询较小数量的大分片可能会更快。简而言之…要视情况而定。
作为起点:
- 旨在将平均分片大小保持在几GB到几十GB之间。对于具有基于时间的数据的用例,通常会看到20GB到40GB范围内的碎片。
- 避免庞大的碎片问题。节点可以容纳的分片数量与可用堆空间成比例。通常,每GB堆空间中的分片数量应少于20。
确定用例最佳配置的最佳方法是通过 使用自己的数据和查询进行测试。
在灾难的情况下
出于性能原因,群集内的节点必须位于同一网络上。跨不同数据中心中的节点在群集中平衡碎片的时间太长了。但是高可用性架构要求您避免将所有鸡蛋都放在一个篮子里。如果一个位置发生重大故障,则另一个位置的服务器需要能够接管。无缝地。答案?跨集群复制(CCR)。
CCR提供了一种方法,可以自动将索引从主群集同步到可以用作热备份的辅助远程群集。如果主群集发生故障,则辅助群集可以接管。您还可以使用CCR创建辅助群集,以接近地理位置的方式向用户提供读取请求。
跨集群复制是主动-被动的。主群集上的索引是活动的领导者索引,并处理所有写请求。复制到辅助群集的索引是只读跟随者。
照料和维护
与任何企业系统一样,您需要工具来保护,管理和监视Elasticsearch集群。集成到Elasticsearch中的安全性,监视和管理功能使您可以将Kibana 用作控制中心来管理集群。类似的特征数据汇总和指标生命周期管理 可帮助您明智随着时间的推移管理您的数据。
Elasticsearch入门
准备好将Elasticsearch用作测试驱动器,并亲自了解如何使用REST API来存储,搜索和分析数据?
逐步完成本入门教程,以:
- 启动并运行Elasticsearch集群
- 索引一些样本文件
- 使用Elasticsearch查询语言搜索文档
- 使用存储桶和指标聚合分析结果
需要更多背景信息?
查看Elasticsearch简介以学习术语,并了解Elasticsearch的工作原理。如果您已经熟悉Elasticsearch并想了解它如何与其余堆栈一起工作,则可能需要跳到 Elastic Stack教程,以了解如何使用Elasticsearch,Kibana,Beats和Logstash。
开始使用Elasticsearch的最快方法是 在云中开始Elasticsearch Service的14天免费试用。
启动Elasticsearch并运行
要将Elasticsearch用作测试驱动器,您可以 在Elasticsearch Service上创建 托管部署,或在您自己的Linux,macOS或Windows计算机上设置多节点Elasticsearch集群。
在云服务器上运行Elasticsearch编辑
在Elasticsearch Service上创建部署时,该服务与Kibana和APM一起配置三节点Elasticsearch集群。
要创建部署:
- 注册免费试用版, 然后验证您的电子邮件地址。
- 为您的帐户设置密码。
- 单击创建部署。
在Linux,MacOS或Windows上运行Elasticsearch
在Elasticsearch Service上创建部署时,将自动设置一个主节点和两个数据节点。通过从tar或zip存档安装,您可以在本地启动Elasticsearch的多个实例,以查看多节点集群的行为。
要在本地运行三节点的Elasticsearch集群:
-
下载适用于您的操作系统的Elasticsearch存档:
Linux: elasticsearch-7.5.1-linux-x86_64.tar.gz
curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.5.1-linux-x86_64.tar.gz
macOS: elasticsearch-7.5.1-darwin-x86_64.tar.gz
curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.5.1-darwin-x86_64.tar.gz
-
提取档案:
Linux:tar -xvf elasticsearch-7.5.1-linux-x86_64.tar.gz
macOS:
tar -xvf elasticsearch-7.5.1-darwin-x86_64.tar.gz
Windows PowerShell:
Expand-Archive elasticsearch-7.5.1-windows-x86_64.zip
-
从bin目录启动Elasticsearch :
Linux and macOS:
cd elasticsearch-7.5.1/bin ./elasticsearch
Windows:
cd elasticsearch-7.5.1\bin .\elasticsearch.bat
现在,您已经建立并运行了一个单节点Elasticsearch集群!
-
启动另外两个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。因为您在本地运行所有三个节点,所以它们会自动与第一个节点一起加入集群。
-
使用cat health API验证三节点集群是否正在运行。cat API以比原始JSON更易于阅读的格式返回有关集群和索引的信息。
您可以通过向Elasticsearch REST API提交HTTP请求来直接与集群交互。本指南中的大多数示例使您能够复制适当的cURL命令并将请求从命令行提交到本地Elasticsearch实例。如果已安装并正在运行Kibana,则也可以打开Kibana并通过开发控制台提交请求。
提示: 当您准备开始在自己的应用程序中使用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%
注意:如果您仅运行单个Elasticsearch实例,则集群状态将保持黄色。单节点群集具有完整的功能,但是无法将数据复制到另一个节点以提供弹性。副本分片必须可用,群集状态为绿色。如果群集状态为红色,则某些数据不可用。
其他安装选项
从存档文件安装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
}
可以从群集中的任何节点立即获得新文档。您可以使用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"
}
}
在bulk中索引文件
如果您有很多要编制索引的文档,则可以使用bulk API批量提交。使用批量处理批处理文档操作比单独提交请求要快得多,因为它可以最大程度地减少网络往返次数。
最佳批处理大小取决于许多因素:文档大小和复杂性,索引编制和搜索负载以及群集可用的资源。一个好的起点是批处理1,000至5,000个文档,总有效负载在5MB至15MB之间。从那里,您可以尝试找到最佳位置。
要将一些数据导入Elasticsearch,您可以开始搜索和分析:
-
下载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" }
-
bank使用以下_bulk请求将帐户数据索引到索引中:
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在请求中不维护任何状态信息。要翻阅搜索结果,请在您的请求中指定from和size参数。
例如,以下请求的匹配数为10到19:
GET /bank/_search
{
"query": { "match_all": {} },
"sort": [
{ "account_number": "asc" }
],
"from": 10,
"size": 10
}
现在,您已经了解了如何提交基本的搜索请求,可以开始构建比有趣的查询match_all。
要在字段中搜索特定术语,可以使用match查询。例如,以下请求搜索该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岁客户的帐户,但不包括居住在Idaho (ID)的任何人:
GET /bank/_search
{
"query": {
"bool": {
"must": [
{ "match": { "age": "40" } }
],
"must_not": [
{ "match": { "state": "ID" } }
]
}
}
}
布尔查询中的每个must,should和must_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聚合使您能够获取有关搜索结果的元信息,并回答诸如“Texas州有多少个帐户持有人?”之类的问题。或“Tennessee州的平均帐户余额是多少?” 您可以在一个请求中搜索文档,过滤命中并使用汇总分析结果。
例如,以下请求使用terms汇总将bank索引中的所有帐户按状态分组,并按降序返回帐户数量最多的十个州:
GET /bank/_search
{
"size": 0,
"aggs": {
"group_by_state": {
"terms": {
"field": "state.keyword"
}
}
}
}
buckets响应中的是state字段中的值。doc_count显示每个州帐户数量。例如,您可以看到ID(Idaho)有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聚合嵌套在先前的 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"
}
}
}
}
}
}
除了这些基本的存储桶和指标聚合外,Elasticsearch还提供了专门的聚合,用于在多个字段上操作并分析特定类型的数据,例如日期,IP地址和地理数据。您还可以将单个聚合的结果馈送到管道聚合中,以进行进一步分析。
聚合提供的核心分析功能可启用高级功能,例如使用机器学习来检测异常。
下一步
现在,您已经建立了一个集群,为一些文档建立了索引,并运行了一些搜索和聚合,您可能想要:
-
深入研究Elastic Stack教程以安装Kibana,Logstash和Beats,并设置基本的系统监视解决方案。
-
将样本数据集之一加载到Kibana中, 以了解如何一起使用Elasticsearch和Kibana来可视化数据。
-
试用其中一种Elastic搜索解决方案: