Elasticsearch6.8开发指南-第二章-Elasticsearch入门

Elasticsearch入门

准备好将Elasticsearch用作测试驱动器,并亲自了解如何使用REST API来存储,搜索和分析数据?

按照此入门教程进行操作:

启动并运行Elasticsearch集群
索引一些样本文件
使用Elasticsearch查询语言搜索文档
使用存储桶和指标聚合分析结果
需要更多背景信息?

查看Elasticsearch简介,学习术语,并了解Elasticsearch工作原理的基础。如果您已经熟悉Elasticsearch并想了解它如何与其余堆栈一起工作,则可能想跳到 Elastic Stack教程,以了解如何使用Elasticsearch,Kibana,Beats和Logstash。

启动并运行Elasticsearch

要将Elasticsearch用作测试驱动器,您可以 在Elasticsearch Service上创建 托管部署,或在您自己的Linux,macOS或Windows计算机上设置多节点Elasticsearch集群。

在Elastic Cloud上运行Elasticsearch编辑
在Elasticsearch Service上创建部署时,该服务与Kibana和APM一起预配一个三节点Elasticsearch集群。

要创建部署:

注册免费试用版, 然后验证您的电子邮件地址。
为您的帐户设置密码。
单击创建部署。
创建部署后,就可以为一些文档建立索引了。

在Linux,macOS或Windows上本地运行Elasticsearch编辑
在Elasticsearch Service上创建部署时,会自动设置一个主节点和两个数据节点。通过从tar或zip存档进行安装,您可以在本地启动Elasticsearch的多个实例,以查看多节点集群的行为。

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

下载适用于您的操作系统的Elasticsearch存档:

Linux和macOS:elasticsearch-6.8.12.tar.gz

curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.8.12.tar.gz

Windows: elasticsearch-6.8.12-windows-x86_64.zip

提取档案:

Linux和macOS:

tar -xvf elasticsearch-6.8.12.tar.gz

Windows PowerShell:

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

从bin目录启动Elasticsearch :

Linux和macOS:

cd elasticsearch-6.8.12/bin
./elasticsearch

Windows:

cd %PROGRAMFILES%\Elastic\Elasticsearch\bin
.\elasticsearch.exe

现在,您已经建立并运行了一个单节点Elasticsearch集群!

启动另外两个Elasticsearch实例,以便您可以看到典型的多节点集群的行为。您需要为每个节点指定唯一的数据和日志路径。

Linux和macOS:

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

Windows:

.\elasticsearch.exe -Epath.data=data2 -Epath.logs=log2
.\elasticsearch.exe -Epath.data=data3 -Epath.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"请求正文中的一对或多 对:

curl -X PUT "localhost:9200/customer/_doc/1?pretty" -H 'Content-Type: application/json' -d'
{
  "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,您可以开始搜索和分析:

下载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/_doc/_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
green 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" : 1000,
    "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岁客户的帐户,但不包括居住在爱达荷州(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聚合使您能够获取有关搜索结果的元信息,并回答诸如“德克萨斯州有多少个帐户持有人”之类的问题。或“田纳西州的平均帐户余额是多少?” 您可以在一个请求中搜索文档,过滤命中并使用汇总分析结果。

例如,以下请求使用terms汇总将bank索引中的所有帐户按状态分组,并以降序返回帐户数量最多的十个州:

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

的buckets响应中的是的值state字段中。该 doc_count节目在每个州帐户数量。例如,您可以看到ID(爱达荷州)有27个帐户。因为请求set size=0,所以响应仅包含聚合结果。

{
  "took": 29,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped" : 0,
    "failed": 0
  },
  "hits" : {
     "total" : 1000,
    "max_score" : 0.0,
    "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搜索解决方案:

网站搜寻
应用搜寻
企业搜寻

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值