我非常熟悉ElasticSearch的功能及其优点,但这是我第一次弄清楚构建索引。因此,我渴望通过专家审核以下方法。
要求:
我们的应用程序从多个来源获取有关各种产品的元数据。通常,这些提要以XML文件形式提供(文件大小可以从2 GB到12 GB不等,有时单个记录分布在多个文件中),并且来自一个提供程序的提要中包含的信息可能与其他提供程序中包含的信息重叠也可能不重叠。因此,我们对这些数据进行重复数据删除,将这些数据规范化为一组常见格式,具体取决于产品类型,并且我们需要提供搜索此整合数据集的能力(显然这是ElasticSearch的用武之地)。 p>
所有产品都有某些通用标识符(如ID,价格等),但核心元数据在不同产品类型之间看起来完全不同。为了量化这一点,我们假设所有产品都有30%的共同字段,70%的字段在产品类型之间有所不同。没有太多的产品类型,并且可以安全地假设在任何时间点都不会超过10种类型。首先,这个数字要小得多(大约3-4个)。
此外,可能会有来自这些数据源的随机间隔更新,其中一些更新需要立即(近实时)反映在搜索中,而不会降低搜索功能。
建议的解决方案:
根据我在此处阅读的内容,我考虑为不同的产品类型设置不同的索引:https://www.elastic.co/blog/index-vs-type。因此,规范化作业将查看源文件,为给定的产品类型创建规范化结构并将其添加到适当的索引。我们公开的搜索API将针对所使用的搜索词对每个索引执行搜索,并将结果合并为具有多个部分的单个JSON响应(每个产品类型一个部分)。
对于更新,我们计划使用批量API进行更新,插入和删除,并且考虑到REST API调用的限制,我们必须分别以x MB的批量进行这些调用。
问题:
这是组织数据并在ElasticSearch中更新它的最佳方式(对于我的用例)吗?在同一个索引上使用多个类型会更好(例如:/包含typeA,typeB等类型的产品的产品)而不是为每个产品类型创建一个索引?如果是这样,搜索会比搜索索引快得多吗?在创建索引后是否有更好的方法来处理记录的CRUD?
提前致谢!
答案 0 :(得分:2)
首先值得注意的是下一个ES版本中的mapping types will go away(ES 6中的软弃用和ES 7中的移除)。
现在,无论类型是否消失,仍然可以使用单个索引,但是由于只有30%的字段是常见的而且should be avoided不惜一切代价,因此会增加稀疏度。
所以,我会说,鉴于数据的性质,您的多索引方法是唯一有意义的方法。
值得一读的其他信息:https://www.elastic.co/guide/en/elasticsearch/reference/master/removal-of-types.html