什么是Elasticsearch中的索引

y3bcpkx1  于 2023-04-05  发布在  ElasticSearch
关注(0)|答案(4)|浏览(175)

什么是Elasticsearch中的索引?一个应用程序有多个索引还是只有一个?
假设你为某个汽车制造商建立了一个系统。它处理人、汽车、备件等。你有一个名为制造商的索引,还是有一个人索引,一个汽车索引,第三个备件索引?有人能解释一下吗?

ou6hu8tu

ou6hu8tu1#

好问题,答案比人们想象的要微妙得多。你可以将索引用于几个不同的目的。

关系索引

最简单和最熟悉的布局是从关系数据库中克隆出来的,你可以(非常粗略地)把索引想象成数据库。

  • MySQL =〉数据库=〉表=〉行/列
  • ElasticSearch =〉Indices =〉Types =〉Documents with Properties

一个ElasticSearch集群可以包含多个Indices(数据库),而这些Types又包含多个Types(表)。这些类型包含多个Documents(行),每个文档都有Properties(列)。
因此,在您的汽车制造场景中,您可能有一个SubaruFactory索引。在此索引中,您有三种不同的类型:

  • People
  • Cars
  • Spare_Parts

每个类型都包含与该类型对应的文档(例如,斯巴鲁Imprezza文档位于Cars类型中。该文档包含有关该特定汽车的所有细节)。
搜索和查询采用以下格式:http://localhost:9200/[index]/[type]/[operation]
所以要检索Subaru文档,我可以这样做:

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

.

日志索引

现在,现实是索引/类型比我们习惯的RDBMS中的数据库/表抽象灵活得多。它们可以被认为是方便的数据组织机制,根据您如何设置数据而增加性能优势。
为了演示一种完全不同的方法,很多人使用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"

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

用户索引

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

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

请注意,这种设置可以很容易地以传统的RDBM方式完成(例如,“用户”索引,以爱好/朋友/图片作为类型)。
相反,出于数据组织和性能原因,有时将数据分开是有意义的。在这个场景中,我们假设每个用户都有 * 很多 * 数据,并且我们希望它们分开。ElasticSearch允许我们为每个用户创建索引。

4ngedf3f

4ngedf3f2#

@Zach的答案适用于elasticsearch 5.X及以下版本。由于elasticsearch 6.X Type已被弃用,并将在7.X中完全删除。引用elasticsearch文档:
最初,我们谈到“索引”类似于SQL数据库中的“数据库”,“类型”等同于“表”。这是一个糟糕的类比,导致了错误的假设。
进一步解释,SQL中来自两个不同表的同名两列可以彼此独立。但在elasticsearch索引中这是不可能的,因为它们由相同的Lucene字段支持。因此,elasticsearch中的“index”与SQL中的“database”不太一样。如果索引中有任何相同的字段,它们最终会产生字段类型冲突。为了避免这种情况,elasticsearch文档建议存储每个文档类型的索引
参考:Removal of mapping types

xn1cxnb4

xn1cxnb43#

索引是一种数据结构,用于存储字段到相应文档的Map。其目的是允许更快的搜索,通常以增加内存使用和预处理时间为代价。
您创建的索引数量是您应该根据应用程序需求采取的设计决策。您可以为每个业务概念创建索引......您可以为一年中的每个月创建索引......
你应该花些时间熟悉lucene和elasticsearch的概念。
看一下introductory video和这个带有一些data design patterns

ctehm74n

ctehm74n4#

上面的一个太详细了,在很短的时间内,它可以被定义为

**索引:**是不同类型文档和文档属性的集合,索引也使用了分片的概念来提高性能。例如,一组文档包含了某个社交应用的数据。答案来自tutorialpoints.com

由于索引是不同类型的文档的集合,因此每个问题取决于您想要如何分类。
你们有一个名为制造商的索引吗?是的,我们将保留一个与制造商有关的文档。
你有一个人的指数,一个汽车和备件的第三个?有人能解释一下吗?想想同一个制造商给许多人在路上驾驶它的例子汽车。所以可能有许多指数取决于使用次数。
如果我们深入思考,我们会发现除了第一个问题之外,所有的都是无效的。ElasticSearch文档与SQL文档或CSV或电子表格文档有很大的不同,从一个索引和强大的查询语言中,您可以创建数百万种CSV风格的数据分类文档。
由于其惊人的速度和索引能力,我们只为一个客户创建一个索引,从中我们根据需要创建多种类型的文档。例如:
所有老人使用同一型号。或一个老人使用所有型号。
排列是无限的。

相关问题