当前位置: 首页 > 知识库问答 >
问题:

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

白彦
2023-03-14

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

>

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

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

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

  • 共有3个答案

    濮升
    2023-03-14

    乔纳森的回答很棒。我只想补充几点其他需要考虑的问题:

    • 可以根据您选择的解决方案自定义碎片数。您可以有一个包含15个主分片的索引,也可以将其拆分为3个包含5个分片的索引-性能透视图不会改变(假设数据平均分布)
    • 考虑数据使用。例如,如果使用kibana可视化,则包含/排除特定索引更容易,但必须在仪表板中过滤类型
    • 数据保留:对于应用程序日志/度量数据,如果需要不同的保留期,请使用不同的索引
    庄高谊
    2023-03-14

    尽管Jonathan当时的回答是正确的,但世界已经改变了,现在看来ElasticSearch的幕后人员已经有了一个长期计划,放弃对多种类型的支持:

    我们想要达到的目的是:我们想要从Elasticsearch中删除类型的概念,同时仍然支持父/子。

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

    杜昆琦
    2023-03-14

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

    假设您使用的是ElasticSearch的默认设置,为每个模型设置1个索引将显著增加碎片的数量,因为1个索引将使用5个碎片,5个数据模型将使用25个碎片;虽然在1个索引中有5个对象类型,但仍将使用5个碎片。

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

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

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

    • 更多的数据将存储在索引的5个分片中,这意味着跨不同数据模型查询时的开销较小,但分片的大小将明显增大。
    • 碎片中的数据越多,Elasticsearch搜索的时间越长,因为要筛选的文档越多。
    • 如果您知道要处理1 TB的数据,并且没有在Elasticsearch映射中的不同索引或多个分片上分发数据,则不建议使用。
    • 建议用于小型数据集,因为您不会浪费存储空间来获得边际性能增益,因为每个分片都会占用硬件空间。

    如果你在问什么是数据太多vs数据太小?它通常取决于处理器的速度和硬件的RAM、在用于Elasticsearch的映射中的每个变量中存储的数据量以及查询要求;在查询中使用多个方面将显著地减慢响应时间。对此没有直接的答案,您将不得不根据您的需要进行基准测试。

     类似资料:
    • 问题内容: 我有一个使用MVC模式开发的应用程序,我现在希望为其建立多个模型的索引,这意味着每个模型具有不同的数据结构。 使用多个索引(每个模型一个索引还是在每个模型的相同索引中使用一个类型)是更好的选择吗?我认为这两种方式都需要不同的搜索查询。我刚刚开始。 如果数据集很小或很大,这两个概念在性能上是否存在差异? 如果有人可以为我推荐一些好的样本数据,我自己会测试第二个问题。 问题答案: 两种方法

    • 我有大量相同类型的实体,每个实体都有大量属性,并且我只有以下两种选择来存储它们: 将每个项存储在索引中并执行多索引搜索 将所有enties存储在单个索引中,并且只搜索1个索引。 一般而言,我想要一个时间复杂度之间的比较搜索“N”实体与“M”特征在上述每一种情况!

    • 我正在学习弹性搜索,还有很多东西我没有得到,但有一件事我不知道(或发现所有的)是什么时候使用一个索引,什么时候使用更多的索引。部分原因是我不知道弹性搜索索引到底是什么。 您能解释一下什么是弹性搜索索引吗?什么时候应该只对所有数据使用一个索引?什么时候应该将数据拆分为多个索引? 奖励点/或者,我如何判断何时需要将我的数据拆分为多个索引,然后,我应该如何决定如何将数据拆分为新的索引?

    • 最初,我认为将一个多索引对象传递给。loc可以提取出我想要的值/级别,但这是行不通的。做这样的事情最好的方法是什么?

    • 我刚加入弹性搜索公司。而不知道如何在JSON请求中对索引和an类型发出正确的请求?(所以我不想像localhost:9200/myindex/mytype/_search那样在URL中使用索引和类型,而是向localhost:9200/_search发出JSON请求) 我试过这样的东西。但我得到的结果是'AAA'索引而不是'BBB'索引。如何只从bbb索引得到结果或者根本没有结果?

    • 我正在尝试从多索引数据帧中仅使用一个索引来创建新的数据帧。 理想情况下,我想要这样的东西: 和: 基本上,我想删除除level之外的多索引的所有其他索引。有没有一个简单的方法可以做到这一点?