【问题标题】:ElasticSearch: Index vs type and handling updatesElasticSearch:索引与类型和处理更新
【发布时间】:2017-12-25 13:16:01
【问题描述】:

我非常熟悉 ElasticSearch 的功能及其优势,但这是我第一次动手构建索引。因此,我渴望得到专家对以下方法的审查。

要求:

我们的应用程序从多个来源获取有关各种产品的元数据。通常,这些提要以 XML 文件的形式出现(文件大小可以从 2 GB 到 12 GB 不等,有时一条记录分布在多个文件中),并且来自一个提供商的提要中包含的信息可能与其他提供商中包含的信息重叠,也可能不重叠.因此,我们对这些数据进行重复数据删除,将这些数据标准化为一组通用格式,具体取决于产品类型,并且我们需要提供针对这个整合数据集进行搜索的能力(显然这就是 ElasticSearch 的用武之地)。

所有产品都有某些通用标识符(如 id、价格等),但核心元数据在不同产品类型之间可能看起来完全不同。为了量化这一点,假设所有产品都有 30% 的共同字段,而产品类型之间有 70% 的字段不同。产品类型并不多,可以肯定地假设任何时候都不会超过 10 种类型。开始的数字要小得多(大约 3-4)。

此外,这些数据源可能会以随机间隔出现更新,其中一些更新需要立即(接近实时)反映在搜索中,而不会降低搜索能力。

建议的解决方案:

根据我在此处阅读的内容,我正在考虑为不同的产品类型设置不同的索引:https://www.elastic.co/blog/index-vs-type。因此规范化作业将查看源文件,为给定的产品类型创建规范化结构并将其添加到适当的索引中。我们公开的搜索 API 将针对所用搜索词的每个索引执行搜索,并将结果整合到具有多个部分(每种产品类型一个部分)的单个 JSON 响应中。

对于更新,我们计划使用批量 API 进行更新、插入和删除,并且考虑到 REST API 调用的限制,我们必须以 x MB 为单位批量进行这些调用。

问题:

这是组织数据并在 ElasticSearch 中更新数据的最佳方式(对于我的用例)?在同一个索引上使用多种类型(例如:/products 包含 typeA、typeB 等类型的产品)而不是为每个产品类型创建一个索引会更好吗?如果是这样,搜索会比跨索引搜索快得多吗?在创建索引后是否有更好的方法来处理记录的 CRUD?

提前致谢!

【问题讨论】:

    标签: search elasticsearch


    【解决方案1】:

    首先值得注意的是,mapping types will go away 在下一个 ES 版本中(ES 6 中的软弃用和 ES 7 中的删除)。

    现在无论类型是否消失,仍然可以使用单个索引,但是您会增加稀疏性,因为您的字段中只有 30% 是通用的,而 should be avoided 不惜一切代价。

    所以,我想说,考虑到数据的性质,您的多索引方法是唯一有意义的方法。

    其他值得阅读的信息:https://www.elastic.co/guide/en/elasticsearch/reference/master/removal-of-types.html

    【讨论】:

    • 谢谢!在更新方面,是否有不同的方式,或者我在批量 API 方面也走在正确的轨道上?
    • 批量 API 非常适合一次更新一个/多个索引中的多个文档,无论您是更新完整/部分文档还是基于脚本。
    • 谢谢。让曾经去过那里并做过的人验证架构思想总是好的:)
    • 使用别名,您的所有产品索引无论如何都会看起来像一个索引 ;-)
    • 这是我的希望,但我还没有完全理解这个概念。如果我搜索仅存在于一种产品类型中的字段,是否会因为缺少该字段而隐式过滤其他产品类型?另外,是否有任何性能方面的考虑?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多