【发布时间】: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