34

什么是 Elasticsearch 中的索引?一个应用程序有多个索引还是只有一个?

假设您为某个汽车制造商构建了一个系统。它涉及人、汽车、备件等。您是否有一个名为制造商的索引,或者您是否有一个人索引、一个汽车索引和第三个备件索引?有人可以解释一下吗?

4

4 回答 4

78

好问题,答案比人们预期的要微妙得多。您可以将索引用于多种不同的目的。

关系指数

最简单和最熟悉的布局克隆了您对关系数据库的期望。您可以(非常粗略地)将索引想象为数据库。

  • MySQL => 数据库 => 表 => 行/列
  • ElasticSearch => 索引 => 类型 => 具有属性的文档

一个 ElasticSearch 集群可以包含多个Indices(数据库),而这些数据库又包含多个Types(表)。这些类型包含多个Documents(行),每个文档都有Properties(列)。

所以在你的汽车制造场景中,你可能有一个SubaruFactory索引。在此索引中,您具有三种不同的类型:

  • People
  • Cars
  • Spare_Parts

然后,每种类型都包含与该类型相对应的文档(例如,Subaru Imprezza 文档位于该Cars类型内部。该文档包含有关该特定汽车的所有详细信息)。

搜索查询格式为:http://localhost:9200/[index]/[type]/[operation]

所以要检索斯巴鲁文档,我可以这样做:

  $ curl -XGET localhost:9200/SubaruFactory/Cars/SubaruImprezza

.

日志记录索引

现在,现实情况是索引/类型比我们在 RDBM 中习惯的数据库/表抽象灵活得多。它们可以被认为是方便的数据组织机制,根据您设置数据的方式具有额外的性能优势。

为了演示一种完全不同的方法,很多人使用 ElasticSearch 进行日志记录。标准格式是为每一天分配一个新索引。您的索引列表可能如下所示:

  • 日志-2013-02-22
  • 日志-2013-02-21
  • 日志-2013-02-20

ElasticSearch 允许您同时查询多个索引,所以这样做不是问题:

  $ curl -XGET localhost:9200/logs-2013-02-22,logs-2013-02-21/Errors/_search=q:"Error Message"

同时搜索过去两天的日志。由于日志的性质,这种格式具有优势 - 大多数日志从未被查看,并且它们以线性时间流进行组织。为每个日志创建索引更合乎逻辑,并为搜索提供更好的性能。

.

用户指数

另一种完全不同的方法是为每个用户创建一个索引。想象一下,你有一个社交网站,每个用户都有大量的随机数据。您可以为每个用户创建一个索引。您的结构可能如下所示:

  • 扎克指数
    • 爱好类型
    • 朋友类型
    • 图片类型
  • 弗雷德指数
    • 爱好类型
    • 朋友类型
    • 图片类型

请注意如何以传统的 RDBM 方式轻松完成此设置(例如,“用户”索引,以爱好/朋友/图片为类型)。然后,所有用户都将被放入一个巨大的索引中。

相反,出于数据组织和性能原因,有时将数据分开是有意义的。在这种情况下,我们假设每个用户都有大量数据,并且我们希望它们分开。ElasticSearch 让我们为每个用户创建一个索引没有问题。

于 2013-02-22T14:29:07.490 回答
20

@Zach 的回答对 elasticsearch 5.X 及以下版本有效。由于 elasticsearch 6.XType已被弃用,并将在 7.X 中完全删除。引用弹性搜索文档:

最初,我们谈到“索引”类似于 SQL 数据库中的“数据库”,“类型”相当于“表”。这是一个糟糕的类比,导致了错误的假设。

进一步说明,来自两个不同表的 SQL 中同名的两个列可以相互独立。但是在弹性搜索索引中这是不可能的,因为它们由相同的 Lucene 字段支持。因此,elasticsearch 中的“索引”与 SQL 中的“数据库”并不完全相同。如果索引中有任何相同的字段,它们最终会出现字段类型冲突。为了避免这种情况,elasticsearch 文档建议存储每个文档类型的索引

参考:删除映射类型

于 2018-01-16T17:56:50.993 回答
0

索引是一种数据结构,用于存储字段到相应文档的映射。目标是允许更快的搜索,通常以增加内存使用和预处理时间为代价。

您创建的索引数量是您应该根据应用程序要求做出的设计决定。您可以为每个业务概念建立一个索引...您可以为一年中的每个月建立一个索引...

您应该花一些时间熟悉 lucene 和 elasticsearch 概念。

看一下介绍视频和一些数据设计模式的视频

于 2013-02-22T14:27:29.020 回答
-1

上面一个太详细了,很短可以定义为

索引:它是不同类型文档和文档属性的集合。Index 还使用分片的概念来提高性能。例如,一组文档包含社交网络应用程序的数据。来自 tutorialpoints.com 的回答

由于索引是每个问题的不同类型文档的集合,这取决于您要如何分类。

您有一个名为制造商的索引吗?是的,我们将与制造商一起保留一份文件。

你有一个人指数,一个汽车指数,第三个备件指数吗?有人可以解释一下吗?想想同一制造商向许多人在路上驾驶它的实例汽车。因此根据使用次数可能会有许多指标。

如果我们深入思考,我们会发现除了第一个问题之外,所有问题都是无效的。弹性搜索文档与 SQL 文档或 csv 或电子表格文档有很大不同,通过一个索引和强大的查询语言,您可以创建数百万种 CSV 样式的数据分类文档。

由于其极快的索引能力,我们只为一个客户创建一个索引,然后我们根据需要创建多种类型的文档网。例如:

所有老人使用相同型号。或一位老人使用所有型号。

排列是无限的。

于 2017-05-16T07:24:32.923 回答