Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ElasticSearch:索引与类型和处理更新_Search_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch - Fatal编程技术网 elasticsearch,Search,elasticsearch" /> elasticsearch,Search,elasticsearch" />

ElasticSearch:索引与类型和处理更新

ElasticSearch:索引与类型和处理更新,search,elasticsearch,Search,elasticsearch,我对ElasticSearch的功能及其优点非常熟悉,但这是我第一次动手建立索引。因此,我渴望得到专家对以下方法的审查 要求: 我们的应用程序从多个来源获取各种产品的元数据。通常,这些提要以XML文件的形式出现(文件大小可以从2 GB到12 GB不等,有时一条记录分布在多个文件中),并且来自一个提供者的提要中包含的信息可能与其他提供者中包含的信息重叠,也可能不重叠。因此,我们对这些数据进行重复数据消除,根据产品类型将这些数据规范化为一组通用格式,并且我们需要提供针对这些整合数据集进行搜索的能力(

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

要求:

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

所有产品都有特定的公共标识符(如id、价格等),但不同产品类型的核心元数据看起来可能完全不同。为了量化这一点,假设所有产品都有30%的字段是相同的,70%的字段在不同的产品类型之间是不同的。没有太多的产品类型,可以安全地假设在任何时候都不会有超过10种类型。首先,这个数字要小得多(大约3-4)

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

建议的解决方案:

根据我在这里读到的内容,我正在考虑为不同的产品类型建立不同的索引:。因此,规范化作业将查看源文件,为给定的产品类型创建规范化结构,并将其添加到适当的索引中。我们公开的搜索API将针对使用的搜索词对这些索引中的每一个执行搜索,并将结果整合到具有多个部分(每个产品类型一个部分)的单个JSON响应中

对于更新,我们计划使用批量API进行更新、插入和删除,并且考虑到REST API调用的限制,我们将不得不批量进行这些调用,每次调用x MB

问题:

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


提前谢谢

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

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

因此,考虑到数据的性质,我认为您的多索引方法是唯一有意义的方法


其他值得一读的信息:

谢谢!在更新方面,是否有其他方法,或者我是否也使用了批量API?批量API非常适合一次更新一个/多个索引中的多个文档,无论您是更新完整/部分文档还是基于脚本。谢谢。让有经验的人验证架构思想总是好的:)使用别名,所有产品索引看起来都像一个索引;-)这是我的希望,但我还没有完全理解这个概念。如果我搜索一个只存在于其中一种产品类型中的字段,其他产品类型会因为没有该字段而被隐式过滤?此外,是否有任何性能方面的考虑?