弹性搜索,多索引对一个索引和不同数据集的类型?

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

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

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

如果有人能为此推荐一些好的样本数据,我将亲自测试第二个问题。

50161 次浏览

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

假设你使用的是 Elasticsearch 的默认设置,为每个模型设置一个索引会显著增加你的碎片数量,因为一个索引会使用5个碎片,5个数据模型会使用25个碎片; 而在一个索引中有5个对象类型仍然会使用5个碎片。

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

  • 在索引中搜索的效率和快速,因为每个分片中的数据量应该更小,因为它分布在不同的索引中。
  • 从2个或更多索引中搜索数据模型的组合将产生开销,因为查询将不得不跨索引发送到更多的碎片,进行编译并发送回用户。
  • 如果数据集较小,则不推荐使用,因为每创建一个额外的碎片都会增加存储空间,而且性能增益微乎其微。
  • 如果您的数据集很大,并且您的查询需要很长时间才能处理,建议使用,因为专用的碎片存储您的特定数据,这将使 Elasticsearch 更容易处理。

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

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

如果你想知道什么是过多的数据,什么是小数据?通常它取决于处理器的速度和硬件的 RAM,Elasticsearch 映射中每个变量中存储的数据量和查询需求; 在查询中使用多个方面会显著降低响应时间。这个问题没有直接的答案,您必须根据自己的需要进行基准测试。

乔纳森的回答很棒,我只想补充几点:

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

以上两个答案都很棒!

我将在索引中添加几种类型的示例。 假设您正在开发一个应用程序来搜索图书馆中的书籍。 有几个问题要问图书馆馆长,

问题:

  1. 你打算储存多少本书?

  2. 你打算在图书馆里存放什么样的书?

  3. 你打算怎么找书?

答案:

  1. 我计划存储5万到7万本书(大约)

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

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

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

//这不是精确的映射,仅仅是为了示例

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

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

索引: 书籍

类别: 科学、艺术

(或者你可以创建许多类型,如技术,医学科学,历史,语言,如果你有更多的书)

这里需要注意的是,模式是相似的,但是数据是不同的。另一件重要的事情是存储的总数据。

希望上面的内容有助于在索引中寻找不同的类型,如果你有不同的模式,你应该考虑不同的索引。数据较少的小索引。大数据大指数: -)

尽管乔纳森当时的回答是正确的,但是世界已经向前发展了,现在看来 ElasticSearch 的开发者有一个长期的计划来放弃对多种类型的支持:

我们希望达到的目标: 我们希望从 Elasticsearch 移除类型的概念,同时仍然支持父母/子女。

因此,对于新项目,每个索引只使用一个类型将使最终升级到 ElasticSearch 6.x 更加容易。