- Elasticsearch 教程
- Elasticsearch - 主页
- Elasticsearch - 基本概念
- Elasticsearch - 安装
- Elasticsearch - 填充
- 版本之间的迁移
- Elasticsearch - API 约定
- Elasticsearch - 文档 API
- Elasticsearch - 搜索 API
- Elasticsearch - 聚合
- Elasticsearch - 索引 API
- Elasticsearch - CAT API
- Elasticsearch - 集群 API
- Elasticsearch - 查询 DSL
- Elasticsearch - 映射
- Elasticsearch - 分析
- Elasticsearch - 模块
- Elasticsearch - 索引模块
- Elasticsearch - 摄取节点
- Elasticsearch - 管理索引生命周期
- Elasticsearch - SQL 访问
- Elasticsearch - 监控
- Elasticsearch - 汇总数据
- Elasticsearch - 冻结索引
- Elasticsearch - 测试
- Elasticsearch - Kibana 仪表板
- Elasticsearch - 按字段过滤
- Elasticsearch - 数据表
- Elasticsearch - 区域地图
- Elasticsearch - 饼图
- Elasticsearch - 面积图和条形图
- Elasticsearch - 时间序列
- Elasticsearch - 标签云
- Elasticsearch - 热图
- Elasticsearch - 画布
- Elasticsearch - 日志 UI
- Elasticsearch 有用资源
- Elasticsearch - 快速指南
- Elasticsearch - 有用的资源
- Elasticsearch - 讨论
Elasticsearch - 快速指南
Elasticsearch - 基本概念
Elasticsearch 是一个基于 Apache Lucene 的搜索服务器。它由 Shay Banon 开发并于 2010 年发布。现在由 Elasticsearch BV 维护。其最新版本是7.0.0。
Elasticsearch 是一个实时分布式开源全文搜索和分析引擎。它可以从 RESTful Web 服务界面访问,并使用无模式 JSON(JavaScript 对象表示法)文档来存储数据。它是基于Java编程语言构建的,因此Elasticsearch可以在不同的平台上运行。它使用户能够以非常高的速度探索大量数据。
一般特征
Elasticsearch 的一般特征如下:
Elasticsearch 的结构化和非结构化数据可扩展到 PB 级。
Elasticsearch 可以用作 MongoDB 和 RavenDB 等文档存储的替代品。
Elasticsearch 使用非规范化来提高搜索性能。
Elasticsearch 是流行的企业搜索引擎之一,目前被维基百科、卫报、StackOverflow、GitHub 等许多大型组织使用。
Elasticsearch 是开源的,可在 Apache 许可证版本 2.0 下使用。
关键概念
Elasticsearch 的关键概念如下:
节点
它指的是 Elasticsearch 的单个运行实例。单个物理和虚拟服务器可容纳多个节点,具体取决于 RAM、存储和处理能力等物理资源的功能。
簇
它是一个或多个节点的集合。集群为整个数据提供跨所有节点的集体索引和搜索功能。
指数
它是不同类型的文档及其属性的集合。Index还使用了分片的概念来提高性能。例如,一组文档包含社交网络应用程序的数据。
文档
它是以 JSON 格式定义的特定方式的字段集合。每个文档都属于一种类型并驻留在索引内。每个文档都与一个称为 UID 的唯一标识符相关联。
碎片
索引被水平细分为分片。这意味着每个分片包含文档的所有属性,但包含的 JSON 对象数量少于索引。水平分离使得分片成为一个独立的节点,可以存储在任意节点中。主分片是索引的原始水平部分,然后这些主分片被复制到副本分片中。
复制品
Elasticsearch 允许用户创建索引和分片的副本。复制不仅有助于提高发生故障时数据的可用性,而且还可以通过在这些副本中执行并行搜索操作来提高搜索性能。
优点
Elasticsearch 是在 Java 上开发的,这使得它兼容几乎所有平台。
Elasticsearch 是实时的,换句话说,一秒钟后,添加的文档就可以在该引擎中搜索到
Elasticsearch 是分布式的,这使得它可以轻松地在任何大型组织中扩展和集成。
使用 Elasticsearch 中存在的网关概念可以轻松创建完整备份。
与 Apache Solr 相比,在 Elasticsearch 中处理多租户非常容易。
Elasticsearch 使用 JSON 对象作为响应,这使得可以使用大量不同的编程语言调用 Elasticsearch 服务器。
Elasticsearch 支持几乎所有文档类型,除了那些不支持文本渲染的文档类型。
缺点
Elasticsearch 在处理请求和响应数据(仅支持 JSON)方面不支持多语言,这与 Apache Solr 不同,在 Apache Solr 中支持 CSV、XML 和 JSON 格式。
有时,Elasticsearch 会出现裂脑情况的问题。
Elasticsearch 与 RDBMS 的比较
在Elasticsearch中,索引类似于RDBMS(关系数据库管理系统)中的表。每个表都是行的集合,就像 Elasticsearch 中每个索引都是文档的集合一样。
下表给出了这些术语之间的直接比较 -
弹性搜索 | 关系型数据库管理系统 |
---|---|
簇 | 数据库 |
碎片 | 碎片 |
指数 | 桌子 |
场地 | 柱子 |
文档 | 排 |
Elasticsearch - 安装
在本章中,我们将详细了解Elasticsearch的安装过程。
要在本地计算机上安装 Elasticsearch,您必须按照以下步骤操作 -
步骤 1 - 检查计算机上安装的 java 版本。它应该是 java 7 或更高版本。您可以通过执行以下操作进行检查 -
在 Windows 操作系统 (OS) 中(使用命令提示符)-
> java -version
在 UNIX 操作系统中(使用终端) -
$ echo $JAVA_HOME
步骤 2 - 根据您的操作系统,从 www.elastic.co 下载 Elasticsearch,如下所述 -
对于 Windows 操作系统,下载 ZIP 文件。
对于 UNIX 操作系统,下载 TAR 文件。
对于 Debian 操作系统,下载 DEB 文件。
对于 Red Hat 和其他 Linux 发行版,请下载 RPN 文件。
APT 和 Yum 实用程序也可用于在许多 Linux 发行版中安装 Elasticsearch。
步骤 3 - Elasticsearch 的安装过程很简单,下面针对不同操作系统进行描述 -
Windows 操作系统- 解压 zip 包并安装 Elasticsearch。
UNIX 操作系统- 在任何位置提取 tar 文件并安装 Elasticsearch。
$wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch7.0.0-linux-x86_64.tar.gz $tar -xzf elasticsearch-7.0.0-linux-x86_64.tar.gz
使用适用于 Linux 操作系统的 APT 实用程序- 下载并安装公共签名密钥
$ wget -qo - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
保存存储库定义,如下所示 -
$ echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.list
使用以下命令运行更新 -
$ sudo apt-get update
现在您可以使用以下命令进行安装 -
$ sudo apt-get install elasticsearch
使用此处给出的命令手动下载并安装 Debian 软件包 -
$wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch7.0.0-amd64.deb $sudo dpkg -i elasticsearch-7.0.0-amd64.deb0
在 Debian Linux 操作系统上使用 YUM 实用程序
下载并安装公共签名密钥 -
$ rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
在“/etc/yum.repos.d/”目录中带有 .repo 后缀的文件中添加以下文本。例如,elasticsearch.repo
elasticsearch-7.x] name=Elasticsearch repository for 7.x packages baseurl=https://artifacts.elastic.co/packages/7.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md
您现在可以使用以下命令安装 Elasticsearch
sudo yum install elasticsearch
步骤 4 - 转到 Elasticsearch 主目录和 bin 文件夹内。如果是 Windows,则运行 elasticsearch.bat 文件;如果是 UNIX rum Elasticsearch 文件,您可以使用命令提示符和终端执行相同的操作。
在 Windows 中
> cd elasticsearch-2.1.0/bin > elasticsearch
在Linux中
$ cd elasticsearch-2.1.0/bin $ ./elasticsearch
注意- 如果是 Windows,您可能会收到一条错误消息,指出未设置 JAVA_HOME,请将其在环境变量中设置为“C:\Program Files\Java\jre1.8.0_31”或安装 java 的位置。
步骤 5 - Elasticsearch Web 界面的默认端口是 9200,或者您可以通过更改 bin 目录中的 elasticsearch.yml 文件内的 http.port 来更改它。您可以通过浏览http://localhost:9200检查服务器是否已启动并运行。它将返回一个 JSON 对象,其中包含有关已安装 Elasticsearch 的信息,如下所示:
{ "name" : "Brain-Child", "cluster_name" : "elasticsearch", "version" : { "number" : "2.1.0", "build_hash" : "72cd1f1a3eee09505e036106146dc1949dc5dc87", "build_timestamp" : "2015-11-18T22:40:03Z", "build_snapshot" : false, "lucene_version" : "5.3.1" }, "tagline" : "You Know, for Search" }
步骤 6 - 在此步骤中,让我们安装 Kibana。请按照下面给出的相应代码在 Linux 和 Windows 上进行安装 -
对于 Linux 上的安装 -
wget https://artifacts.elastic.co/downloads/kibana/kibana-7.0.0-linuxx86_64.tar.gz tar -xzf kibana-7.0.0-linux-x86_64.tar.gz cd kibana-7.0.0-linux-x86_64/ ./bin/kibana
对于 Windows 上的安装 -
从 https://www.elastic.co/products/kibana 下载 Windows 版 Kibana 。单击链接后,您将找到如下所示的主页 -
解压并进入Kibana主目录然后运行。
CD c:\kibana-7.0.0-windows-x86_64 .\bin\kibana.bat
Elasticsearch - 填充
在本章中,让我们学习如何向 Elasticsearch 添加一些索引、映射和数据。请注意,其中一些数据将在本教程中解释的示例中使用。
创建索引
您可以使用以下命令来创建索引 -
PUT school
回复
如果创建了索引,您可以看到以下输出 -
{"acknowledged": true}
添加数据
Elasticsearch 将存储我们添加到索引的文档,如以下代码所示。文档被赋予一些用于识别文档的 ID。
请求正文
POST school/_doc/10 { "name":"Saint Paul School", "description":"ICSE Afiliation", "street":"Dawarka", "city":"Delhi", "state":"Delhi", "zip":"110075", "location":[28.5733056, 77.0122136], "fees":5000, "tags":["Good Faculty", "Great Sports"], "rating":"4.5" }
回复
{ "_index" : "school", "_type" : "_doc", "_id" : "10", "_version" : 1, "result" : "created", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 2, "_primary_term" : 1 }
在这里,我们添加另一个类似的文档。
POST school/_doc/16 { "name":"Crescent School", "description":"State Board Affiliation", "street":"Tonk Road", "city":"Jaipur", "state":"RJ", "zip":"176114","location":[26.8535922,75.7923988], "fees":2500, "tags":["Well equipped labs"], "rating":"4.5" }
回复
{ "_index" : "school", "_type" : "_doc", "_id" : "16", "_version" : 1, "result" : "created", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 9, "_primary_term" : 7 }
通过这种方式,我们将继续添加在接下来的章节中工作所需的任何示例数据。
在 Kibana 中添加示例数据
Kibana 是一个 GUI 驱动的工具,用于访问数据和创建可视化。在本节中,让我们了解如何向其中添加示例数据。
在 Kibana 主页中,选择以下选项来添加示例电子商务数据 -
下一个屏幕将显示一些可视化和一个添加数据的按钮 -
单击添加数据将显示以下屏幕,确认数据已添加到名为 eCommerce 的索引中。
Elasticsearch - 版本之间的迁移
在任何系统或软件中,当我们升级到新版本时,我们需要按照几个步骤来维护应用程序设置、配置、数据和其他内容。需要执行这些步骤才能使应用程序在新系统中稳定或保持数据的完整性(防止数据损坏)。
您需要按照以下步骤升级 Elasticsearch -
从https://www.elastic.co/阅读升级文档
在非生产环境(例如 UAT、E2E、SIT 或 DEV 环境)中测试升级版本。
请注意,如果没有数据备份,则无法回滚到以前的 Elasticsearch 版本。因此,建议在升级到更高版本之前备份数据。
我们可以使用完全集群重启或滚动升级来升级。滚动升级适用于新版本。请注意,当您使用滚动升级方法进行迁移时,不会出现服务中断。
升级步骤
在升级生产集群之前,在开发环境中测试升级。
备份您的数据。除非您有数据快照,否则无法回滚到早期版本。
在开始升级过程之前,请考虑关闭机器学习作业。虽然机器学习作业可以在滚动升级期间继续运行,但它会增加升级过程中集群的开销。
按以下顺序升级 Elastic Stack 的组件 -
- 弹性搜索
- 木花
- 日志存储
- 节拍
- APM服务器
从 6.6 或更早版本升级
要从版本 6.0-6.6 直接升级到 Elasticsearch 7.1.0,您必须手动重新索引需要继续使用的任何 5.x 索引,并执行完整的集群重启。
全集群重启
完全集群重启的过程包括关闭集群中的每个节点,将每个节点升级到 7x,然后重新启动集群。
以下是完整集群重启需要执行的高级步骤 -
- 禁用分片分配
- 停止索引并执行同步刷新
- 关闭所有节点
- 升级所有节点
- 升级任何插件
- 启动每个升级的节点
- 等待所有节点加入集群并报告黄色状态
- 重新启用分配
重新启用分配后,集群开始将副本分片分配给数据节点。此时,可以安全地恢复索引和搜索,但如果您可以等到所有主分片和副本分片已成功分配并且所有节点的状态均为绿色,您的集群将恢复得更快。
Elasticsearch - API 约定
Web 中的应用程序编程接口 (API) 是一组函数调用或其他编程指令,用于访问特定 Web 应用程序中的软件组件。例如,Facebook API帮助开发人员通过访问Facebook的数据或其他功能来创建应用程序;它可以是出生日期或状态更新。
Elasticsearch 提供 REST API,可通过 HTTP 上的 JSON 进行访问。Elasticsearch 使用一些我们现在将讨论的约定。
多重指数
API中的大部分操作,主要是搜索等操作,都是针对一个或多个索引的。这有助于用户只需执行一次查询即可在多个位置或所有可用数据中进行搜索。许多不同的符号用于在多个索引中执行操作。我们将在本章中讨论其中的一些。
逗号分隔符号
POST /index1,index2,index3/_search
请求正文
{ "query":{ "query_string":{ "query":"any_string" } } }
回复
来自index1、index2、index3的JSON对象,其中包含any_string。
_all 所有指数的关键字
POST /_all/_search
请求正文
{ "query":{ "query_string":{ "query":"any_string" } } }
回复
来自所有索引并包含 any_string 的 JSON 对象。
通配符(*、+、–)
POST /school*/_search
请求正文
{ "query":{ "query_string":{ "query":"CBSE" } } }
回复
来自所有索引的 JSON 对象,这些索引以包含 CBSE 的 school 开头。
或者,您也可以使用以下代码 -
POST /school*,-schools_gov /_search
请求正文
{ "query":{ "query_string":{ "query":"CBSE" } } }
回复
来自所有以“school”开头但不来自 school_gov 且包含 CBSE 的索引的 JSON 对象。
还有一些 URL 查询字符串参数 -
- ignore_unavailable - 如果 URL 中存在的一个或多个索引不存在,则不会发生错误或不会停止任何操作。例如,schools 索引存在,但 book_shops 不存在。
POST /school*,book_shops/_search
请求正文
{ "query":{ "query_string":{ "query":"CBSE" } } }
请求正文
{ "error":{ "root_cause":[{ "type":"index_not_found_exception", "reason":"no such index", "resource.type":"index_or_alias", "resource.id":"book_shops", "index":"book_shops" }], "type":"index_not_found_exception", "reason":"no such index", "resource.type":"index_or_alias", "resource.id":"book_shops", "index":"book_shops" },"status":404 }
考虑以下代码 -
POST /school*,book_shops/_search?ignore_unavailable = true
请求正文
{ "query":{ "query_string":{ "query":"CBSE" } } }
响应(无错误)
来自所有索引的 JSON 对象,这些索引以包含 CBSE 的 school 开头。
允许无索引
如果带有通配符的 URL 没有索引,则此参数的true值将防止错误。例如,没有以 school_pri 开头的索引 -
POST /schools_pri*/_search?allow_no_indices = true
请求正文
{ "query":{ "match_all":{} } }
响应(无错误)
{ "took":1,"timed_out": false, "_shards":{"total":0, "successful":0, "failed":0}, "hits":{"total":0, "max_score":0.0, "hits":[]} }
扩展通配符
该参数决定通配符是否需要扩展为开放索引或封闭索引或两者都执行。该参数的值可以是打开和关闭或者无和全部。
例如,关闭索引学校 -
POST /schools/_close
回复
{"acknowledged":true}
考虑以下代码 -
POST /school*/_search?expand_wildcards = closed
请求正文
{ "query":{ "match_all":{} } }
回复
{ "error":{ "root_cause":[{ "type":"index_closed_exception", "reason":"closed", "index":"schools" }], "type":"index_closed_exception", "reason":"closed", "index":"schools" }, "status":403 }
索引名称中的日期数学支持
Elasticsearch 提供了根据日期和时间搜索索引的功能。我们需要以特定格式指定日期和时间。例如,accountdetail-2015.12.30,索引将存储 2015 年 12 月 30 日的银行帐户详细信息。可以执行数学运算来获取特定日期或日期和时间范围的详细信息。
日期数学索引名称的格式 -
<static_name{date_math_expr{date_format|time_zone}}> /<accountdetail-{now-2d{YYYY.MM.dd|utc}}>/_search
static_name 是表达式的一部分,在每个日期数学索引(如帐户详细信息)中保持相同。date_math_expr 包含像 now-2d 一样动态确定日期和时间的数学表达式。date_format 包含在索引中写入日期的格式,如 YYYY.MM.dd。如果今天的日期是 2015 年 12 月 30 日,则 <accountdetail-{now-2d{YYYY.MM.dd}}> 将返回 accountdetail-2015.12.28。
表达 | 决心 |
---|---|
<accountdetail-{now-d}> | 账户详情-2015.12.29 |
<accountdetail-{now-M}> | 账户详情-2015.11.30 |
<accountdetail-{现在{YYYY.MM}}> | 账户详情-2015.12 |
我们现在将看到 Elasticsearch 中可用的一些常用选项,可用于获取指定格式的响应。
漂亮的结果
我们只需附加一个 URL 查询参数即可获得格式良好的 JSON 对象的响应,即 Pretty = true。
POST /schools/_search?pretty = true
请求正文
{ "query":{ "match_all":{} } }
回复
…………………….. { "_index" : "schools", "_type" : "school", "_id" : "1", "_score" : 1.0, "_source":{ "name":"Central School", "description":"CBSE Affiliation", "street":"Nagan", "city":"paprola", "state":"HP", "zip":"176115", "location": [31.8955385, 76.8380405], "fees":2000, "tags":["Senior Secondary", "beautiful campus"], "rating":"3.5" } } ………………….
人类可读的输出
此选项可以将统计响应更改为人类可读形式(如果人类 = true)或计算机可读形式(如果人类 = false)。例如,当响应需要由另一个计算机程序使用时,如果 human = true,则 distance_kilometer = 20KM,如果 human = false,则 distance_meter = 20000。
响应过滤
我们可以通过在 field_path 参数中添加更少的字段来过滤响应。例如,
POST /schools/_search?filter_path = hits.total
请求正文
{ "query":{ "match_all":{} } }
回复
{"hits":{"total":3}}
Elasticsearch - 文档 API
Elasticsearch提供单文档API和多文档API,其中API调用分别针对单个文档和多个文档。
索引API
当向具有特定映射的相应索引发出请求时,它有助于在索引中添加或更新 JSON 文档。例如,以下请求会将 JSON 对象添加到索引学校和学校映射下 -
PUT schools/_doc/5 { name":"City School", "description":"ICSE", "street":"West End", "city":"Meerut", "state":"UP", "zip":"250002", "location":[28.9926174, 77.692485], "fees":3500, "tags":["fully computerized"], "rating":"4.5" }
运行上面的代码,我们得到以下结果 -
{ "_index" : "schools", "_type" : "_doc", "_id" : "5", "_version" : 1, "result" : "created", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 2, "_primary_term" : 1 }
自动创建索引
当发出将 JSON 对象添加到特定索引的请求时,如果该索引不存在,则此 API 会自动创建该索引以及该特定 JSON 对象的基础映射。可以通过将 elasticsearch.yml 文件中存在的以下参数的值更改为 false 来禁用此功能。
action.auto_create_index:false index.mapper.dynamic:false
您还可以通过更改以下参数的值来限制索引的自动创建,其中仅允许具有特定模式的索引名称 -
action.auto_create_index:+acc*,-bank*
注意- 这里+表示允许,-表示不允许。
版本控制
Elasticsearch 还提供版本控制工具。我们可以使用版本查询参数来指定特定文档的版本。
PUT schools/_doc/5?version=7&version_type=external { "name":"Central School", "description":"CBSE Affiliation", "street":"Nagan", "city":"paprola", "state":"HP", "zip":"176115", "location":[31.8955385, 76.8380405], "fees":2200, "tags":["Senior Secondary", "beautiful campus"], "rating":"3.3" }
运行上面的代码,我们得到以下结果 -
{ "_index" : "schools", "_type" : "_doc", "_id" : "5", "_version" : 7, "result" : "updated", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 3, "_primary_term" : 1 }
版本控制是一个实时过程,不受实时搜索操作的影响。
有两种最重要的版本控制类型 -
内部版本控制
内部版本控制是默认版本,从 1 开始,并随着每次更新(包括删除)而递增。
外部版本控制
当文档的版本控制存储在外部系统(例如第三方版本控制系统)中时使用它。要启用此功能,我们需要将 version_type 设置为 external。这里Elasticsearch将存储外部系统指定的版本号,并且不会自动增加它们。
操作类型
操作类型用于强制创建操作。这有助于避免覆盖现有文档。
PUT chapter/_doc/1?op_type=create { "Text":"this is chapter one" }
运行上面的代码,我们得到以下结果 -
{ "_index" : "chapter", "_type" : "_doc", "_id" : "1", "_version" : 1, "result" : "created", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 0, "_primary_term" : 1 }
自动生成ID
当索引操作中未指定ID时,Elasticsearch会自动为该文档生成id。
POST chapter/_doc/ { "user" : "tpoint", "post_date" : "2018-12-25T14:12:12", "message" : "Elasticsearch Tutorial" }
运行上面的代码,我们得到以下结果 -
{ "_index" : "chapter", "_type" : "_doc", "_id" : "PVghWGoB7LiDTeV6LSGu", "_version" : 1, "result" : "created", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 1, "_primary_term" : 1 }
获取API
API 通过对特定文档执行 get 请求来帮助提取类型 JSON 对象。
pre class="prettyprint notranslate" > GET schools/_doc/5
运行上面的代码,我们得到以下结果 -
{ "_index" : "schools", "_type" : "_doc", "_id" : "5", "_version" : 7, "_seq_no" : 3, "_primary_term" : 1, "found" : true, "_source" : { "name" : "Central School", "description" : "CBSE Affiliation", "street" : "Nagan", "city" : "paprola", "state" : "HP", "zip" : "176115", "location" : [ 31.8955385, 76.8380405 ], "fees" : 2200, "tags" : [ "Senior Secondary", "beautiful campus" ], "rating" : "3.3" } }
该操作是实时的,不受Index刷新率的影响。
您还可以指定版本,然后 Elasticsearch 将仅获取该版本的文档。
您还可以在请求中指定_all,以便Elasticsearch可以在每种类型中搜索该文档id,并返回第一个匹配的文档。
您还可以在该特定文档的结果中指定所需的字段。
GET schools/_doc/5?_source_includes=name,fees
运行上面的代码,我们得到以下结果 -
{ "_index" : "schools", "_type" : "_doc", "_id" : "5", "_version" : 7, "_seq_no" : 3, "_primary_term" : 1, "found" : true, "_source" : { "fees" : 2200, "name" : "Central School" } }
您还可以通过在获取请求中添加 _source 部分来获取结果中的源部分。
GET schools/_doc/5?_source
运行上面的代码,我们得到以下结果 -
{ "_index" : "schools", "_type" : "_doc", "_id" : "5", "_version" : 7, "_seq_no" : 3, "_primary_term" : 1, "found" : true, "_source" : { "name" : "Central School", "description" : "CBSE Affiliation", "street" : "Nagan", "city" : "paprola", "state" : "HP", "zip" : "176115", "location" : [ 31.8955385, 76.8380405 ], "fees" : 2200, "tags" : [ "Senior Secondary", "beautiful campus" ], "rating" : "3.3" } }
您还可以在执行 get 操作之前通过将刷新参数设置为 true 来刷新分片。
删除API
您可以通过向 Elasticsearch 发送 HTTP DELETE 请求来删除特定索引、映射或文档。
DELETE schools/_doc/4
运行上面的代码,我们得到以下结果 -
{ "found":true, "_index":"schools", "_type":"school", "_id":"4", "_version":2, "_shards":{"total":2, "successful":1, "failed":0} }
可以指定文档的版本来删除该特定版本。可以指定路由参数来删除特定用户的文档,如果文档不属于该特定用户,则操作失败。在此操作中,您可以像 GET API 一样指定刷新和超时选项。
更新API
脚本用于执行此操作,版本控制用于确保在获取和重新索引期间没有发生更新。例如,您可以使用脚本更新学校的费用 -
POST schools/_update/4 { "script" : { "source": "ctx._source.name = params.sname", "lang": "painless", "params" : { "sname" : "City Wise School" } } }
运行上面的代码,我们得到以下结果 -
{ "_index" : "schools", "_type" : "_doc", "_id" : "4", "_version" : 3, "result" : "updated", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 4, "_primary_term" : 2 }
您可以通过向更新的文档发送 get 请求来检查更新情况。
Elasticsearch - 搜索 API
该API用于在Elasticsearch中搜索内容。用户可以通过发送带有查询字符串作为参数的 get 请求来进行搜索,也可以在 post 请求的消息正文中发布查询。主要是所有的搜索API都是多索引、多类型的。
多索引
Elasticsearch 允许我们搜索所有索引或某些特定索引中存在的文档。例如,如果我们需要搜索名称包含central的所有文档,我们可以这样做 -
GET /_all/_search?q=city:paprola
运行上面的代码,我们得到以下响应 -
{ "took" : 33, "timed_out" : false, "_shards" : { "total" : 7, "successful" : 7, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 1, "relation" : "eq" }, "max_score" : 0.9808292, "hits" : [ { "_index" : "schools", "_type" : "school", "_id" : "5", "_score" : 0.9808292, "_source" : { "name" : "Central School", "description" : "CBSE Affiliation", "street" : "Nagan", "city" : "paprola", "state" : "HP", "zip" : "176115", "location" : [ 31.8955385, 76.8380405 ], "fees" : 2200, "tags" : [ "Senior Secondary", "beautiful campus" ], "rating" : "3.3" } } ] } }
统一资源定位符搜索
可以使用统一资源标识符在搜索操作中传递许多参数 -
序列号 | 参数及说明 |
---|---|
1 | 问 该参数用于指定查询字符串。 |
2 | 宽容 该参数用于指定查询字符串。只需将此参数设置为 true 即可忽略基于格式的错误。默认情况下为 false。 |
3 | 领域 该参数用于指定查询字符串。 |
4 | 种类 我们可以通过该参数得到排序后的结果,该参数的可能值为fieldName,fieldName:asc/fieldname:desc |
5 | 暂停 我们可以使用此参数限制搜索时间,并且响应仅包含指定时间内的命中。默认情况下,没有超时。 |
6 | 终止后 我们可以将每个分片的响应限制为指定数量的文档,达到该数量后查询将提前终止。默认情况下,没有terminate_after。 |
7 | 从 要返回的命中索引的起始位置。默认为 0。 |
8 | 尺寸 它表示返回的命中数。默认为 10。 |
请求正文搜索
我们还可以在请求正文中使用查询 DSL 来指定查询,前面的章节已经给出了很多示例。这里给出了一个这样的例子 -
POST /schools/_search { "query":{ "query_string":{ "query":"up" } } }
运行上面的代码,我们得到以下响应 -
{ "took" : 11, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 1, "relation" : "eq" }, "max_score" : 0.47000363, "hits" : [ { "_index" : "schools", "_type" : "school", "_id" : "4", "_score" : 0.47000363, "_source" : { "name" : "City Best School", "description" : "ICSE", "street" : "West End", "city" : "Meerut", "state" : "UP", "zip" : "250002", "location" : [ 28.9926174, 77.692485 ], "fees" : 3500, "tags" : [ "fully computerized" ], "rating" : "4.5" } } ] } }
Elasticsearch - 聚合
聚合框架收集搜索查询选择的所有数据,并由许多构建块组成,这有助于构建复杂的数据摘要。聚合的基本结构如下所示 -
"aggregations" : { "" : { "" : { } [,"meta" : { [] } ]? [,"aggregations" : { []+ } ]? } [,"" : { ... } ]* }
聚合有不同类型,每种都有其自己的用途。本章将详细讨论它们。
指标聚合
这些聚合有助于根据聚合文档的字段值计算矩阵,有时可以从脚本生成一些值。
数值矩阵要么是单值(如平均聚合),要么是多值(如统计数据)。
平均聚合
此聚合用于获取聚合文档中存在的任何数字字段的平均值。例如,
POST /schools/_search { "aggs":{ "avg_fees":{"avg":{"field":"fees"}} } }
运行上面的代码,我们得到以下结果 -
{ "took" : 41, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 2, "relation" : "eq" }, "max_score" : 1.0, "hits" : [ { "_index" : "schools", "_type" : "school", "_id" : "5", "_score" : 1.0, "_source" : { "name" : "Central School", "description" : "CBSE Affiliation", "street" : "Nagan", "city" : "paprola", "state" : "HP", "zip" : "176115", "location" : [ 31.8955385, 76.8380405 ], "fees" : 2200, "tags" : [ "Senior Secondary", "beautiful campus" ], "rating" : "3.3" } }, { "_index" : "schools", "_type" : "school", "_id" : "4", "_score" : 1.0, "_source" : { "name" : "City Best School", "description" : "ICSE", "street" : "West End", "city" : "Meerut", "state" : "UP", "zip" : "250002", "location" : [ 28.9926174, 77.692485 ], "fees" : 3500, "tags" : [ "fully computerized" ], "rating" : "4.5" } } ] }, "aggregations" : { "avg_fees" : { "value" : 2850.0 } } }
基数聚合
此聚合给出特定字段的不同值的计数。
POST /schools/_search?size=0 { "aggs":{ "distinct_name_count":{"cardinality":{"field":"fees"}} } }
运行上面的代码,我们得到以下结果 -
{ "took" : 2, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 2, "relation" : "eq" }, "max_score" : null, "hits" : [ ] }, "aggregations" : { "distinct_name_count" : { "value" : 2 } } }
注意- 基数的值为 2,因为费用有两个不同的值。
扩展统计数据聚合
此聚合生成有关聚合文档中特定数字字段的所有统计信息。
POST /schools/_search?size=0 { "aggs" : { "fees_stats" : { "extended_stats" : { "field" : "fees" } } } }
运行上面的代码,我们得到以下结果 -
{ "took" : 8, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 2, "relation" : "eq" }, "max_score" : null, "hits" : [ ] }, "aggregations" : { "fees_stats" : { "count" : 2, "min" : 2200.0, "max" : 3500.0, "avg" : 2850.0, "sum" : 5700.0, "sum_of_squares" : 1.709E7, "variance" : 422500.0, "std_deviation" : 650.0, "std_deviation_bounds" : { "upper" : 4150.0, "lower" : 1550.0 } } } }
最大聚合
此聚合查找聚合文档中特定数字字段的最大值。
POST /schools/_search?size=0 { "aggs" : { "max_fees" : { "max" : { "field" : "fees" } } } }
运行上面的代码,我们得到以下结果 -
{ "took" : 16, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 2, "relation" : "eq" }, "max_score" : null, "hits" : [ ] }, "aggregations" : { "max_fees" : { "value" : 3500.0 } } }
最小聚合
此聚合查找聚合文档中特定数字字段的最小值。
POST /schools/_search?size=0 { "aggs" : { "min_fees" : { "min" : { "field" : "fees" } } } }
运行上面的代码,我们得到以下结果 -
{ "took" : 2, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 2, "relation" : "eq" }, "max_score" : null, "hits" : [ ] }, "aggregations" : { "min_fees" : { "value" : 2200.0 } } }
求和聚合
此聚合计算聚合文档中特定数字字段的总和。
POST /schools/_search?size=0 { "aggs" : { "total_fees" : { "sum" : { "field" : "fees" } } } }
运行上面的代码,我们得到以下结果 -
{ "took" : 8, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 2, "relation" : "eq" }, "max_score" : null, "hits" : [ ] }, "aggregations" : { "total_fees" : { "value" : 5700.0 } } }
还有一些其他指标聚合用于特殊情况,例如用于地理位置目的的地理边界聚合和地理质心聚合。
统计数据聚合
多值指标聚合,用于计算从聚合文档中提取的数值的统计信息。
POST /schools/_search?size=0 { "aggs" : { "grades_stats" : { "stats" : { "field" : "fees" } } } }
运行上面的代码,我们得到以下结果 -
{ "took" : 2, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 2, "relation" : "eq" }, "max_score" : null, "hits" : [ ] }, "aggregations" : { "grades_stats" : { "count" : 2, "min" : 2200.0, "max" : 3500.0, "avg" : 2850.0, "sum" : 5700.0 } } }
聚合元数据
您可以在请求时使用元标记添加一些有关聚合的数据,并可以获得响应。
POST /schools/_search?size=0 { "aggs" : { "avg_fees" : { "avg" : { "field" : "fees" } , "meta" :{ "dsc" :"Lowest Fees This Year" } } } }
运行上面的代码,我们得到以下结果 -
{ "took" : 0, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 2, "relation" : "eq" }, "max_score" : null, "hits" : [ ] }, "aggregations" : { "avg_fees" : { "meta" : { "dsc" : "Lowest Fees This Year" }, "value" : 2850.0 } } }
Elasticsearch - 索引 API
这些 API 负责管理索引的所有方面,如设置、别名、映射、索引模板。
创建索引
该API可帮助您创建索引。当用户将 JSON 对象传递到任何索引时,可以自动创建索引,也可以在此之前创建索引。要创建索引,您只需发送带有设置、映射和别名的 PUT 请求,或者发送一个不带正文的简单请求。
PUT colleges
运行上面的代码,我们得到如下所示的输出 -
{ "acknowledged" : true, "shards_acknowledged" : true, "index" : "colleges" }
我们还可以在上面的命令中添加一些设置 -
PUT colleges { "settings" : { "index" : { "number_of_shards" : 3, "number_of_replicas" : 2 } } }
运行上面的代码,我们得到如下所示的输出 -
{ "acknowledged" : true, "shards_acknowledged" : true, "index" : "colleges" }
删除索引
该API可帮助您删除任何索引。您只需传递带有该特定索引名称的删除请求。
DELETE /colleges
您可以仅使用 _all 或 * 删除所有索引。
获取索引
只需向一个或多个索引发送 get 请求即可调用此 API。这将返回有关索引的信息。
GET colleges
运行上面的代码,我们得到如下所示的输出 -
{ "colleges" : { "aliases" : { "alias_1" : { }, "alias_2" : { "filter" : { "term" : { "user" : "pkay" } }, "index_routing" : "pkay", "search_routing" : "pkay" } }, "mappings" : { }, "settings" : { "index" : { "creation_date" : "1556245406616", "number_of_shards" : "1", "number_of_replicas" : "1", "uuid" : "3ExJbdl2R1qDLssIkwDAug", "version" : { "created" : "7000099" }, "provided_name" : "colleges" } } } }
您可以使用_all或*来获取所有索引的信息。
索引存在
只需向该索引发送 get 请求即可确定该索引是否存在。如果HTTP响应是200,则存在;如果是404,则不存在。
HEAD colleges
运行上面的代码,我们得到如下所示的输出 -
200-OK
索引设置
您只需在 URL 末尾附加 _settings 关键字即可获取索引设置。
GET /colleges/_settings
运行上面的代码,我们得到如下所示的输出 -
{ "colleges" : { "settings" : { "index" : { "creation_date" : "1556245406616", "number_of_shards" : "1", "number_of_replicas" : "1", "uuid" : "3ExJbdl2R1qDLssIkwDAug", "version" : { "created" : "7000099" }, "provided_name" : "colleges" } } } }
指数统计
此 API 可帮助您提取有关特定索引的统计信息。您只需发送一个 get 请求,并在末尾添加索引 URL 和 _stats 关键字。
GET /_stats
运行上面的代码,我们得到如下所示的输出 -
……………………………………………… }, "request_cache" : { "memory_size_in_bytes" : 849, "evictions" : 0, "hit_count" : 1171, "miss_count" : 4 }, "recovery" : { "current_as_source" : 0, "current_as_target" : 0, "throttle_time_in_millis" : 0 } } ………………………………………………
冲洗
索引的刷新过程可确保当前仅保留在事务日志中的任何数据也会永久保留在 Lucene 中。这减少了恢复时间,因为在打开 Lucene 索引后不需要从事务日志中重新索引数据。
POST colleges/_flush
运行上面的代码,我们得到如下所示的输出 -
{ "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 } }
Elasticsearch - Cat API
通常,各种 Elasticsearch API 的结果以 JSON 格式显示。但 JSON 并不总是易于阅读。因此,Elasticsearch 中提供的 cat API 功能有助于提供更易于阅读和理解的结果打印格式。cat API 中使用了各种参数来实现不同的目的,例如 - 术语 V 使输出变得冗长。
让我们在本章中更详细地了解 cat API。
冗长
详细输出很好地显示了 cat 命令的结果。在下面给出的示例中,我们获取了集群中存在的各种索引的详细信息。
GET /_cat/indices?v
运行上面的代码,我们得到如下所示的响应 -
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size yellow open schools RkMyEn2SQ4yUgzT6EQYuAA 1 1 2 1 21.6kb 21.6kb yellow open index_4_analysis zVmZdM1sTV61YJYrNXf1gg 1 1 0 0 283b 283b yellow open sensor-2018-01-01 KIrrHwABRB-ilGqTu3OaVQ 1 1 1 0 4.2kb 4.2kb yellow open colleges 3ExJbdl2R1qDLssIkwDAug 1 1 0 0 283b 283b
标头
h 参数也称为 header,用于仅显示命令中提到的那些列。
GET /_cat/nodes?h=ip,port
运行上面的代码,我们得到如下所示的响应 -
127.0.0.1 9300
种类
sort 命令接受查询字符串,该字符串可以按查询中的指定列对表进行排序。默认排序为升序,但可以通过将 :desc 添加到列来更改。
下面的示例给出了按归档索引模式降序排列的模板结果。
GET _cat/templates?v&s=order:desc,index_patterns
运行上面的代码,我们得到如下所示的响应 -
name index_patterns order version .triggered_watches [.triggered_watches*] 2147483647 .watch-history-9 [.watcher-history-9*] 2147483647 .watches [.watches*] 2147483647 .kibana_task_manager [.kibana_task_manager] 0 7000099
数数
count 参数提供整个集群中文档总数的计数。
GET /_cat/count?v
运行上面的代码,我们得到如下所示的响应 -
epoch timestamp count 1557633536 03:58:56 17809
Elasticsearch - 集群 API
集群 API 用于获取有关集群及其节点的信息并对它们进行更改。为了调用这个API,我们需要指定节点名称、地址或_local。
GET /_nodes/_local
运行上面的代码,我们得到如下所示的响应 -
……………………………………………… cluster_name" : "elasticsearch", "nodes" : { "FKH-5blYTJmff2rJ_lQOCg" : { "name" : "ubuntu", "transport_address" : "127.0.0.1:9300", "host" : "127.0.0.1", "ip" : "127.0.0.1", "version" : "7.0.0", "build_flavor" : "default", "build_type" : "tar", "build_hash" : "b7e28a7", "total_indexing_buffer" : 106502553, "roles" : [ "master", "data", "ingest" ], "attributes" : { ………………………………………………
集群健康状况
该API用于通过附加“health”关键字来获取集群的健康状况。
GET /_cluster/health
运行上面的代码,我们得到如下所示的响应 -
{ "cluster_name" : "elasticsearch", "status" : "yellow", "timed_out" : false, "number_of_nodes" : 1, "number_of_data_nodes" : 1, "active_primary_shards" : 7, "active_shards" : 7, "relocating_shards" : 0, "initializing_shards" : 0, "unassigned_shards" : 4, "delayed_unassigned_shards" : 0, "number_of_pending_tasks" : 0, "number_of_in_flight_fetch" : 0, "task_max_waiting_in_queue_millis" : 0, "active_shards_percent_as_number" : 63.63636363636363 }
集群状态
此 API 用于通过附加“state”关键字 URL 来获取有关集群的状态信息。状态信息包含版本、主节点、其他节点、路由表、元数据和块。
GET /_cluster/state
运行上面的代码,我们得到如下所示的响应 -
……………………………………………… { "cluster_name" : "elasticsearch", "cluster_uuid" : "IzKu0OoVTQ6LxqONJnN2eQ", "version" : 89, "state_uuid" : "y3BlwvspR1eUQBTo0aBjig", "master_node" : "FKH-5blYTJmff2rJ_lQOCg", "blocks" : { }, "nodes" : { "FKH-5blYTJmff2rJ_lQOCg" : { "name" : "ubuntu", "ephemeral_id" : "426kTGpITGixhEzaM-5Qyg", "transport } ………………………………………………
集群统计信息
此 API 有助于使用“stats”关键字检索有关集群的统计信息。此 API 返回分片数量、存储大小、内存使用情况、节点数量、角色、操作系统和文件系统。
GET /_cluster/stats
运行上面的代码,我们得到如下所示的响应 -
…………………………………………. "cluster_name" : "elasticsearch", "cluster_uuid" : "IzKu0OoVTQ6LxqONJnN2eQ", "timestamp" : 1556435464704, "status" : "yellow", "indices" : { "count" : 7, "shards" : { "total" : 7, "primaries" : 7, "replication" : 0.0, "index" : { "shards" : { "min" : 1, "max" : 1, "avg" : 1.0 }, "primaries" : { "min" : 1, "max" : 1, "avg" : 1.0 }, "replication" : { "min" : 0.0, "max" : 0.0, "avg" : 0.0 } ………………………………………….
集群更新设置
此 API 允许您使用“settings”关键字更新集群的设置。有两种类型的设置 - 持久性(在重新启动时应用)和暂时性(在整个集群重新启动后不会保留)。
节点统计
该API用于检索集群中多一个节点的统计信息。节点统计数据与集群几乎相同。
GET /_nodes/stats
运行上面的代码,我们得到如下所示的响应 -
{ "_nodes" : { "total" : 1, "successful" : 1, "failed" : 0 }, "cluster_name" : "elasticsearch", "nodes" : { "FKH-5blYTJmff2rJ_lQOCg" : { "timestamp" : 1556437348653, "name" : "ubuntu", "transport_address" : "127.0.0.1:9300", "host" : "127.0.0.1", "ip" : "127.0.0.1:9300", "roles" : [ "master", "data", "ingest" ], "attributes" : { "ml.machine_memory" : "4112797696", "xpack.installed" : "true", "ml.max_open_jobs" : "20" }, ………………………………………………………….
节点 hot_threads
此 API 可帮助您检索有关集群中每个节点上当前热门线程的信息。
GET /_nodes/hot_threads
运行上面的代码,我们得到如下所示的响应 -
:::{ubuntu}{FKH-5blYTJmff2rJ_lQOCg}{426kTGpITGixhEzaM5Qyg}{127.0.0.1}{127.0.0.1:9300}{ml.machine_memory=4112797696, xpack.installed=true, ml.max_open_jobs=20} Hot threads at 2019-04-28T07:43:58.265Z, interval=500ms, busiestThreads=3, ignoreIdleThreads=true:
Elasticsearch - 查询 DSL
在Elasticsearch中,搜索是通过使用基于JSON的查询来进行的。查询由两个子句组成 -
叶查询子句- 这些子句是匹配、术语或范围,它们在特定字段中查找特定值。
复合查询子句- 这些查询是叶查询子句和其他复合查询的组合,以提取所需的信息。
Elasticsearch 支持大量查询。查询以查询关键字开始,然后以 JSON 对象的形式包含条件和过滤器。下面描述了不同类型的查询。
匹配所有查询
这是最基本的查询;它返回所有内容,每个对象的得分为 1.0。
POST /schools/_search { "query":{ "match_all":{} } }
运行上面的代码,我们得到以下结果 -
{ "took" : 7, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 2, "relation" : "eq" }, "max_score" : 1.0, "hits" : [ { "_index" : "schools", "_type" : "school", "_id" : "5", "_score" : 1.0, "_source" : { "name" : "Central School", "description" : "CBSE Affiliation", "street" : "Nagan", "city" : "paprola", "state" : "HP", "zip" : "176115", "location" : [ 31.8955385, 76.8380405 ], "fees" : 2200, "tags" : [ "Senior Secondary", "beautiful campus" ], "rating" : "3.3" } }, { "_index" : "schools", "_type" : "school", "_id" : "4", "_score" : 1.0, "_source" : { "name" : "City Best School", "description" : "ICSE", "street" : "West End", "city" : "Meerut", "state" : "UP", "zip" : "250002", "location" : [ 28.9926174, 77.692485 ], "fees" : 3500, "tags" : [ "fully computerized" ], "rating" : "4.5" } } ] } }
全文查询
这些查询用于搜索全文,例如章节或新闻文章。该查询根据与该特定索引或文档关联的分析器进行工作。在本节中,我们将讨论