什么是弹性搜索?
Elasticsearch 是一个分布式、全文、开源的搜索引擎。 它提供多租户功能来分析来自 Logstash 或 Kibana 等来源的聚合数据类型。 此应用程序存储和索引信息,然后可以查询特定数据。 它返回有关特定程序、日志分析、应用程序性能数据或其他信息的有用详细信息。
安装顺序
安装 弹性堆栈,按以下顺序部署这些应用程序。
安装
要安装 Elasticsearch,请参阅我们的知识库文章以获取更深入的说明。 以下是基本的安装步骤。
- 下载并解压 Elasticsearch 官方发行版。
- 接下来,在 Linux 或 macOS 上运行 bin/elasticsearch。 在 Windows 上运行 binelasticsearch.bat。
- 然后, curl -X 获取 https://localhost:9200/。
- 启动更多服务器
什么是索引?
索引只是将数据添加到 Elasticsearch 中的过程。 Elasticsearch 存储和检索这些数据 Apache Lucene 索引。 我们不会在本文中专门讨论 Lucene,因为我们需要更深入地研究该应用程序才能真正了解 Elasticsearch 所扮演的角色。 本文主要面向新用户在 Lucene 中使用基本的 GET 和 PUT 请求。
要求
放
当我们知道或想要指定数据类型的 ID 时,我们会发送 PUT 请求。 如果我们希望 Elasticsearch 自己为该项目生成一个 ID,我们可以使用 POST。 一个简单的 POST 命令示例如下所示。
curl -XPOST 'localhost:9200/logs/test_app' -H 'Content-Type: application/json' -d'
{
"timestamp": "2020-08-20 09:10:11",
"message": "Test user is logged in",
"user_id": 2,
"admin": false
}
'
输出如下所示:
{"_index":"logs","_type":"test_app","_id":"e8rHCnQBSXUbYazxinrq","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":1,"_primary_term":1}
输出
我们可以在上面提供的输出中看到 id 是由 Elasticsearch 生成的。我们还可以注意到“version”和“created”字段。 这意味着 test_app 文件是使用我们之前不存在的 POST 命令创建的。 让我们回顾一下如何使用 PUT 请求索引某些内容。
curl -X PUT 'localhost:9200/app/users/4' -H 'Content-Type: application/json' -d '
{
"id": 2,
"username": "Dean",
"last_login": "2020-08-20 09:10:11"
}
'
使用这个命令,我们得到这个输出。
{"_index":"app","_type":"users","_id":"4","_version":2,"result":"updated","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":1,"_primary_term":1}
通过这个条目,我们在 /app/users/ 目录下索引了用户 Dean。
输入的所有数据都作为 JSON 对象发送。 如果我们问它是如何在没有任何数据结构的情况下工作的,答案很简洁。 Elasticsearch 通常用作 NoSQL 数据库,因此不需要结构。 接下来,我们将检查如何使用 Elasticsearch 执行查询。
什么是查询?
查询只是使用精心设计的查询搜索来定位给定位置内的特定信息。 使用查询,我们可以将弹性搜索中的问题分为两大类。
- 叶查询 – 叶查询在某些字段中查找特定值。 我们可以独立运行 Leaf Query,其中一些被称为 match、term 和 range 查询。
- 复合查询 – 复合查询是叶查询和复合查询的组合。 复合查询将多个查询组合成一个查询,以便我们更轻松地获得所需内容。
查询类型
Elasticsearch 查询的完整分类如下所示:
- 叶查询
- 全文
- 术语查询
- 地理查询
- 跨度查询
- 加入查询
- 专业查询
- 复合查询
- 布尔
- 提升
- 最大DIS
- 恒定分数
- 功能评分
我们不必知道所有这些查询类型就可以使用 elasticsearch 运行一些基本命令,因为其中许多是高级命令,并且需要的不仅仅是程序的基本知识。 我们在此处列出它们是为了更好地了解 elasticsearch 的功能。 让我们回顾一下可用于 Elasticsearch 的一些基本查询命令。
注意:要使用 Elasticsearch 查询某些内容,我们必须先对其进行索引!
例子
由于我们使用前面的命令索引了我们的应用程序,现在让我们尝试查询它。 一个简单的命令看起来像这样。
curl -XGET 'localhost:9200/app/users/4?pretty'
这将是输出:
{
"_index" : "app",
"_type" : "users",
"_id" : "4",
"_version" : 1,
"_seq_no" : 0,
"_primary_term" : 1,
"found" : true,
"_source" : {
"id" : 2,
"username" : "Dean",
"last_login" : "2020-08-20 09:10:11"
}
}
使用这个命令,我们查询了“app”下的所有用户。 它将返回基本信息,例如用户名、ID、上次登录时间等。 每个前面带下划线的字段都是我们查询的元字段。 在 _source 下,我们可以看到被索引的原始文档。 查询 Elasticsearch 最简单的方法是使用“URI 搜索”。 我们提供单个搜索词或单词,Elasticsearch 将梳理我们集群中每个文档的每个字段。 为了 example,我们可以使用这个查询:
curl -XGET 'localhost:9200/_search?q=dean'
Elasticsearch 会找到其中包含“Dean”一词的每个字段。 最后,输出查询将如下所示。
{"took":60,"timed_out":false,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0},"hits":{"total":{"value":1,"relation":"eq"},"max_score":0.2876821,"hits":[{"_index":"app","_type":"users","_id":"4","_score":0.2876821,"_source":
{
"id": 2,
"username": "Dean",
"last_login": "2020-08-20 09:10:11"
}
}]}}
输出
正如我们所看到的,输出产生了搜索词和搜索结果。 让我们快速分解一下这些信息。
拿 = 查询完成的秒数
时间到 = 非常简单; false 表示查询未超时,true 表示已超时
碎片 = Elasticsearch 所经过的文档数量以及其中有多少搜索成功,有多少被跳过,有多少失败
命中 = 实际满足查询条件的字段数量,以及元信息
在里面 example 上面,我们在 Elasticsearch 中记录的所有索引信息中搜索了特定字段。 我们可以通过提供到有限文档子集的路径来进一步缩小查询范围。 这样,我们也可以减少查询时间。 所以,而不是:
curl -XGET 'localhost:9200/_search?q=dean'
我们将使用:
curl -XGET 'localhost:9200/app/users/_search?q=dean'
输出将是相同的,但在这种情况下,“花费”(搜索时间范围)只有 3 秒,而不是我们在之前的查询中观察到的 60 秒。 当我们知道存储某些信息的特定目录但不确定哪个文档包含我们需要的信息时,这很方便。
现在我们已经了解了使用 Elasticsearch 进行索引和查询的基础知识,让我们继续删除索引文档。
什么是删除?
与我们使用先前命令的方式相同,我们可以使用 Delete 函数删除存储在集群中的数据。 不同之处在于,我们通过 HTTP 请求使用 DELETION。
curl -XDELETE 'localhost:9200/app/users/4?pretty'
我们的输出将如下所示:
[root@host ~]# curl -XDELETE 'localhost:9200/app/users/4?pretty'
{
"_index" : "app",
"_type" : "users",
"_id" : "4",
"_version" : 1,
"result" : "not_found",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 2,
"_primary_term" : 1
}
为了删除单个索引,可以使用以下命令。
curl -XDELETE 'localhost:9200/logs?pretty'
如果我们想删除一个已经被索引的整个文档,我们可以使用这个命令。
curl -XDELETE 'localhost:9200/path/to/document'
我们在这两种情况下得到的响应将如下所示。
{
"acknowledged" : true
}
结论
在本文中,我们介绍了一些基本的 Elasticsearch 命令,但几乎没有触及其所有功能的表面。 可以使用多个查询变体来搜索我们的信息,但我们需要多篇文章来深入涵盖所有这些。 我们希望本文能够提供 Elasticsearch 的一些基础知识,因为它只是作为对这个强大且多功能的搜索引擎的介绍而编写的。
加入我们!
今天就联系我们 1.800.580.4985 与知识渊博的解决方案提供商交谈,他们可以为您提供我们任何一条产品线所需的信息,以帮助您立即做出明智的决定。
太忙没时间说话? 点击 这里 打开与我们的快速聊天以了解更多信息。 您想在闲暇时查看电子邮件中的信息吗? 立即给我们发送电子邮件,以获得关于我们产品线中哪种产品最适合您的需求的可靠建议。
我们期待您的回音!