Elasticsearch中的索引是什么?

时间:2013-02-22 13:59:05

标签: java ruby elasticsearch full-text-search

Elasticsearch中的索引是什么?一个应用程序有多个索引还是只有一个? 假设你为一些汽车制造商建立了一个系统。它涉及人,汽车,备件等。你有一个名为制造商的索引,或者你有一个人的索引,一个汽车索引和三个备件?有人可以解释一下吗?

4 个答案:

答案 0 :(得分:50)

好问题,答案比人们预期的要微不足道。您可以将索引用于多种用途。

关系指数

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

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

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

因此,在您的汽车制造方案中,您可能拥有SubaruFactory索引。在此索引中,您有三种不同的类型:

  • People
  • Cars
  • Spare_Parts

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

搜索和查询采用以下格式:http://localhost:9200/[index]/[type]/[operation]

因此,为了检索Subaru文档,我可以这样做:

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

记录指数

现在,实际情况是Indices / Types比我们在RDBM中习惯的数据库/表抽象灵活得多。它们可以被视为方便的数据组织机制,并根据您设置数据的方式提供额外的性能优势。

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

  • 日志-2013年2月22日
  • 日志-2013年2月21日
  • 日志-2013年2月20日

ElasticSearch允许您同时查询多个索引,因此这不是一个问题:

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

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

用户指数

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

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

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

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

答案 1 :(得分:7)

@ Zach的答案对于5.X及以下的elasticsearch有效。由于elasticsearch 6.X Type已弃用,将在7.X中完全删除。引用elasticsearch文档:

  

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

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

参考:Removal of mapping types

答案 2 :(得分:0)

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

您创建的索引数量是您应根据应用程序要求进行的设计决策。您可以拥有每个业务概念的索引......您可以为一年中的每个月编制索引...

你应该投入一些时间熟悉lucene和elasticsearch概念。

使用introductory video

查看data design patterns和此{{}}

答案 3 :(得分:0)

上面的内容非常简短,可以定义为

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

由于索引是按照问题收集不同类型的文档,因此取决于您希望如何分类。

您是否有一个名为制造商的索引? 是的,我们会将一份文件与制造商保持一致。

你有一个人的索引,一个用于汽车,三个用于备件吗?有人能解释一下吗 想想同一制造商给很多人在路上行驶的实例车。因此根据使用次数可能会有很多指数。

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

由于其快速且索引的功能,我们只为一个客户创建一个索引,因此我们根据需要创建了许多类型的documnet。 例如:

所有使用相同型号的老人。或者使用所有型号的老人。

排列是无限的。