Elasticsearch 索引是什么?

在科技界,index 这个词被赋予了非常多的含义。如果您问开发人员什么是 index,他们大多数人可能会告诉您,index (索引)通常是指关系数据库 (RDBMS) 中与表关联的一种数据结构,用于提高数据检索操作的速度。
那么,什么是 Elasticsearch ® 索引呢?Elasticsearch 索引是一个逻辑命名空间,用于保存一组文档。每个文档由多个字段组成,而字段则是包含数据的键值对。
Elasticsearch 索引与关系数据库有何不同?
Elasticsearch 索引与关系数据库中的索引并不相同。您可以将 Elasticsearch 集群看作一个数据库,其中包含的多个索引可视为一组表,而每个索引又包含许多文档。
- RDBMS => 数据库 => 表 => 列/行
- Elasticsearch => 集群 => 索引 => 分片 => 带有键值对的文档
虽然 Elasticsearch 存储的是 JSON 文档,但您输入索引的内容却非常灵活。使用多种可用的集成和 Beats,可以快速启动和运行。您也可以更进一步,使用摄取管道或 Logstash®,辅以其众多处理器和插件来定义自己的 ETL 流程。
与关系数据库的另一个不同之处在于,您无需预先定义任何架构即可导入数据。动态类型非常适合帮助您快速入门,也可用于处理文档中的意外字段。设置完成后,您可以切换到固定架构,以提升性能。
运行时字段是另一项有趣的功能,让您可以执行“读时架构”或“写时架构”操作。您可以将运行时字段添加到现有文档以派生新字段,也可以在查询时创建这些字段。您可以将其理解为通过脚本计算得出的值,能够读取文档的源数据。
立即了解 Elasticsearch 与关系数据库之间的区别。在 Elastic Cloud 上注册试用账户,开启免费体验。
数据如何与 Elasticsearch 的用户友好型 API 进行交互
Elasticsearch 提供了基于 JSON 的 RESTful API, 用于与文档数据进行交互。您可以通过向相应的集群终端节点发送 HTTP 请求来索引、搜索、更新和删除文档。这些类似增删改查 (CRUD) 的操作可以在单个文档级别上进行,也可以在索引级别本身进行。如果您愿意的话, 也可以使用特定编程语言的客户端库来代替直接 REST。
以下示例在名为 playwrights 的索引中创建了一个文档, 其分配的 document_ id 为 1。请注意,我们不需要创建任何模式或预先配置;我们只需插入数据即可。
POST /playwrights/_doc/1
{
"firstname": "William",
"lastname": "Shakespeare"
}我们可以根据需要进一步添加文档和字段,而关系数据库却无法轻松做到这一点。
POST /playwrights/_doc/2
{
"firstname": "Samuel",
"lastname": "Beckett",
"year_of_birth": 1906
}现在,我们可以使用搜索终端查询出所有文档。
GET /playwrights/_search
{
"query": {
"match_all": {}
}
}或者我们也可以查询具体的出生年份。
GET /playwrights/_search
{
"query": {
“match": {
“year_of_birth": 1906
}
}
}除了基本查询功能外,Elasticsearch 还提供模糊匹配、词干提取、相关性评分、高亮显示和分词等高级搜索功能。分词会将文本拆分为更小的片段,称为“词元”。在大多数情况下,这些词元是单个词,但也有许多不同的分词器可供选择。
为什么反规范化数据是加快数据检索的关键?
在关系数据库中,通常会进行规范化,以消除数据冗余并确保数据一致性。例如,您可能会为客户、产品和订单分别设置不同的表。
在 Elasticsearch 中,反规范化是一种常见的做法。您可以将所有相关信息存储在单个 JSON 文档中,而不是将数据分散存储到多个表中。例如,一个订单文档将直接包含客户信息和产品信息,而不是存储指向独立的产品和客户索引的外键。这样一来,在 Elasticsearch 中执行搜索操作便可以更快、更高效地进行检索。而通常而言,存储成本可能比联接数据的计算成本更低。
Elasticsearch 如何确保分布式系统的可扩展性?
每个索引以唯一名称标识,并被划分为一个或多个分片,这些分片是索引的较小子集,允许在 Elasticsearch 节点集群中进行并行处理和分布式存储。分片有主分片和副本分片,副本提供数据的冗余副本,以应对硬件故障,并增加处理读取请求(如搜索或检索文档)的能力。
向集群中添加更多节点,即可提高索引和搜索的能力,而关系数据库却无法轻松做到这一点。
回到上文的 playwrights 示例,如果我们运行以下代码,就可以看到 Elasticsearch 自动推断出的类型映射,以及该索引已分配的分片数和副本数。
GET /playwrights/
使用 Elasticsearch 可以索引哪些类型的数据?
Elasticsearch 可以索引多种类型的数据,首先是文本,其次还包括数字和地理位置数据。它还可以存储用于相似度搜索的密集向量。下面让我们依次来看一看这些数据。
用于文本/词汇搜索的倒排索引
Elasticsearch 还会为特定字段类型选择最合适的底层数据结构。例如,文本会先进行分词,然后存储在倒排索引中。倒排索引是一种数据结构,可列出任一文档中出现的每个唯一词元,并识别每个词元出现在哪些文档中。
下表显示了倒排索引的一般构成。我们可以看到,如果搜索“London”一词,就会发现这个词在索引中出现在六个不同的文档中。正是通过这种倒排索引,我们才能够非常快地执行文本查询。
词元 | 文档 ID |
伦敦 | 1,3,8,12,23,88 |
巴黎 | 1,12,88 |
| 马德里 | 3,8,12 |
| 柏林 | 12,23 |
用于进行高效空间分析的数字和地理位置搜索功能
数字和地理位置数据会存储在 BKD 树中,也称为 Block KD-Tree 索引。这是一种用于工程应用的数据结构,可高效支持多维数据的空间索引和查询。它会将数据点组织成块,从而支持在大型数据集中快速执行范围搜索和最近邻查询。对于需要处理空间数据分析和优化的工程师而言,这是一个非常有价值的工具。
基于 NLP 的向量/语义搜索
您可能听说过向量搜索,但它究竟是什么?向量搜索引擎(也称为向量数据库、语义搜索或余弦搜索)用于查找与给定(向量化)查询最接近的最近邻。向量搜索的强大之处在于,它可以发现文本并不完全匹配的相似文档;而在上文倒排索引的示例中,通常需要精确的文本匹配。相比之下,向量搜索通过向量来描述某种程度的相似性。
相关内容:什么是向量搜索?
向量搜索的一些常见应用场景包括:
- 回答问题
- 查找此前已解答问题的答案,其中所提问题在文本形式上虽相似,但并非完全一致
- 提供推荐 — 例如,音乐应用根据您的偏好查找相似歌曲。
所有这些用例都会利用具有数万个维度的向量,从而全面表示数据,以便准确评估相似性并提供有针对性的推荐。
Elasticsearch 通过 dense_vector 文档类型支持向量搜索,并能够对文档中的向量和搜索词转换的向量运行相似度搜索 。
对于想要更深入研究生成式 AI 的用户,我们还提供 ESRE,即 Elasticsearch Relevance Engine™,它专为基于 AI 的搜索应用程序提供支持。ESRE 为开发人员提供了一整套成熟的检索算法,并具有与大型语言模型集成的能力。
您接下来应该怎么做
准备好后,您可以通过以下三种方式了解我们如何帮助您将数据应用于业务:
- 开始免费试用,了解 Elastic Cloud 如何助力您的业务。
- 欢迎观看 Elasticsearch 入门网络研讨会。
- 浏览我们的产品,了解 Elasticsearch Platform 的运作方式,以及我们的解决方案如何满足您的需求。
最初发布于 2013 年 2 月 24 日;更新于 2023 年 7 月 17 日。