弹性搜索,多个索引与一个索引以及不同数据集的类型?


161

我有一个使用MVC模式开发的应用程序,现在我希望为它的多个模型建立索引,这意味着每个模型具有不同的数据结构。

  • 使用多个索引(每个模型一个索引还是在每个模型的相同索引中使用一个类型)是更好的选择吗?我认为这两种方式都需要不同的搜索查询。我刚刚开始。

  • 如果数据集很小或很大,这两个概念在性能上是否存在差异?

我会亲自测试第二个问题,是否有人可以为此目的推荐一些好的样本数据。

Answers:


184

两种方法都有不同的含义。

假设您使用的是Elasticsearch的默认设置,则每个模型具有1个索引将大大增加分片的数量,因为1个索引将使用5个分片,而5个数据模型将使用25个分片;在1个索引中有5种对象类型时,仍将使用5个分片。

将每个数据模型作为索引的含义:

  • 在索引内进行搜索的效率高且速度快,因为每个分片中的数据量应较小,因为它已分配给不同的索引。
  • 从2个或多个索引中搜索数据模型的组合将产生开销,因为查询将必须跨索引发送到更多分片,然后编译并发送回用户。
  • 如果您的数据集很小,则不建议这样做,因为在创建每个额外的分片时会占用更多的存储空间,并且性能提升很小。
  • 如果您的数据集很大并且查询需要花费很长时间,则建议使用此方法,因为专用分片将存储您的特定数据,并且Elasticsearch会更容易处理。

将每个数据模型作为索引中的对象类型的含义:

  • 更多数据将存储在索引的5个分片中,这意味着在跨不同数据模型进行查询时,开销问题较小,但分片大小会大大增加。
  • 碎片中的更多数据将需要更长的时间供Elasticsearch搜索,因为有更多文档需要过滤。
  • 如果您知道要处理1 TB的数据并且没有在Elasticsearch映射中的不同索引或多个分片中分布数据,则不建议使用。
  • 推荐用于小型数据集,因为您不会浪费存储空间以提高性能,因为每个分片都占用您的硬件空间。

如果您要问什么是太多数据与小数据?通常,它取决于处理器速度和硬件的RAM,用于Elasticsearch的映射中每个变量内存储的数据量以及查询要求;在查询中使用许多方面会大大降低您的响应时间。没有直接的答案,您将必须根据需要进行基准测试。


8
这个答案是不完整的,而不从信息elasticsearch.org/guide/en/elasticsearch/guide/current/...
AndreKR

5
为了增加出色的答案,我引用了ES 5.2文档,它解释了为什么不建议维护大量分片:“ By default elasticsearch rejects search requests that would query more than 1000 shards. The reason is that such large numbers of shards make the job of the coordinating node very CPU and memory intensive. It is usually a better idea to organize data in such a way that there are fewer larger shards. In case you would like to bypass this limit, which is discouraged, you can update the action.search.shard_count.limit cluster setting to a greater value.
遗忘


13

乔纳森的答案很好。我只需要添加其他几点考虑:

  • 可以根据您选择的解决方案自定义碎片数量。您可能有一个包含15个主要分片的索引,或者将其分为5个分片的3个索引-性能角度不会改变(假设数据分布均匀)
  • 考虑数据使用情况。就是 如果您使用kibana进行可视化,则包含/排除特定索引会更容易,但是必须在信息中心中过滤类型
  • 数据保留:对于应用程序日志/度量标准数据,如果需要不同的保留期限,请使用不同的索引

保留期是什么意思?您是指现场时间吗?这是基于每个文档设置的。
Kshitiz Sharma

不,这里的保留期是指文档/索引的保留时间-存储这些数据的时间。基于数据质量,大小,重要性-我用来指定不同的保留策略。在7天后删除某些数据/索引,在6w之后删除某些数据/索引,而在10
Marcel Matus 16'Aug

2

以上两个答案都很棒!

我在索引中添加了几种类型的示例。假设您正在开发一个用于在图书馆中搜索书籍的应用程序。向图书馆馆长提出的问题很少,

问题:

  1. 您打算存储几本书?

  2. 您要在图书馆中存放哪种书?

  3. 您打算如何搜寻书籍?

答案:

  1. 我计划存储约5万到7万本图书

  2. 我将拥有15 k -20 k技术相关的书籍(计算机科学,机械工程,化学工程等),15 k的历史书籍,10 k的医学书籍。10 k与语言相关的书籍(英语,西班牙语等)

  3. 按作者名字,作者姓氏,出版年份,出版者名称搜索。(这使您了解应在索引中存储哪些信息)

从上面的答案中,我们可以说索引中的模式应该看起来像这样。

//这不是确切的映射,仅用于示例

            "yearOfPublish":{
                "type": "integer"
            },
            "author":{
                "type": "object",
                "properties": {
                    "firstName":{
                        "type": "string"
                    },
                    "lastName":{
                        "type": "string"
                    }
                }
            },
            "publisherName":{
                "type": "string"
            }
        }

为了实现上述目的,我们可以创建一个称为Books的索引,并且可以具有多种类型。

索引:书

类型:科学,艺术

(或者,如果您有更多书籍,则可以创建许多类型,例如技术,医学,历史,语言)

这里要注意的重要一点是架构是相似的,但是数据并不相同。另一个重要的事情是您要存储的总数据。

希望以上内容对何时在索引中使用不同类型有帮助,如果您具有不同的架构,则应考虑使用不同的索引。索引较小,数据较少。大数据大索引:-)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.