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

重组elasticsearch索引以允许对值之和进行筛选

顾学真
2023-03-14

我有一个产品索引。

每个产品都有几个变种(可以是几个或几百个,每个都有一个颜色和大小,例如红色)

每一个变体,都可以在几个仓库(aronud 100个仓库)(在一定数量)。

仓库有AB、XY、CD等代码。

如果我可以选择,我会将其索引为:

stock: {
  Red: {
    S: { AB: 100, XY: 200, CD: 20 },
    M: { AB: 0, XY: 500, CD: 20 },
    2XL: { AB: 5, XY: 0, CD: 9 }
  },
  Blue: { 
    ...
  }
}

以下是我可能收到的一种客户查询:

给我看所有的产品,有红色。S颜色的库存(至少100)在仓库AB和XY。

所以这可能是一个过滤器

Red.S.AB > 100 AND Red.S.XY > 100

我不是在这里编写完整的filter查询,而是简单的弹性查询。

问题是,给定100个仓库,100个大小,25种颜色,这很容易需要100*100*25=250K映射。Elasticsearch根本无法处理这么多的键。

简单的答案是使用嵌套文档,但是嵌套文档带来了一个特殊的问题。我们不能在给定的嵌套文档中求和,嵌套文档速度很慢,特别是当我们每个产品有250K的时候。

我对外部解决方案的开放程度也比弹性好。我们是Rails/Postgres堆栈。

共有1个答案

游皓
2023-03-14

你有你的产品索引与变体,这很好,但我会使用另一个索引来管理任何与多仓库库存相关的东西。每个产品/尺寸/颜色/仓库都有一个文档和相关的计数。例如:

{
  "product": 123,
  "color": "Red",
  "size": "S",
  "warehouse": "AB",
  "quantity": 100
}

{
  "product": 123,
  "color": "Red",
  "size": "S",
  "warehouse": "XY",
  "quantity": 200
}

{
  "product": 123,
  "color": "Red",
  "size": "S",
  "warehouse": "CD",
  "quantity": 20
}
etc...

这样,您对股票的查询将更加灵活,因为您只需要在字段(产品颜色大小仓库)上进行筛选,并简单地对数量字段、总和、平均值或您可能想到的任何东西进行聚合。

您可能需要利用bucket_script管道聚合来决定总和是高于还是低于所需的阈值。

通过简单地为任何给定组合编制新数量索引来维护库存变动也比每次商品出库时更新主产品文档要容易得多。

无需脚本,无需嵌套文档。

 类似资料:
  • 我目前正在使用ElasticSearch(PHP客户端)构建一个电子商务系统搜索,但遇到了一个问题 我存储的数据是简单文本(如产品名称)和列表(如颜色、大小)的混合体 我遇到的问题是当产品没有任何颜色时 我有以下字段 所以当我发送一个产品时,它看起来是这样的 这就像预期的一样,但是当我尝试发送这样的东西时 它抛出了一个错误: {“error”:{“root_cause”:[{“type”:“map

  • 问题内容: 假设我有一个数组A。我有一系列索引对(a1,b1),(a2,b2)…(an,bn) 我想获取这些对之间元素的所有和。即 就运行时而言,最有效的方法是什么? 谢谢! 问题答案: 假设您的索引对存储在一个NumPy形状的数组中并且相当大,最好避免任何Python循环:

  • 问题内容: 我正在使用Elasticsearch 2.3.3并试图为现有索引创建一个精确的副本。(使用与Elasticsearch安装捆绑在一起的reindex插件) 问题是复制了数据,但是忽略了诸如映射和分析器之类的设置。 精确复制现有索引(包括所有设置)的最佳方法是什么? 我的主要目标是创建副本,更改副本,并且只有在一切顺利的情况下,才将别名替换为副本。(零宕机时间备份和还原) 问题答案: 以

  • 问题内容: 以下是我的数据框。我进行了一些转换以创建类别列,并删除了其所属的原始列。现在,我需要进行分组,以除去公母,并且可以通过总和来汇总。 这是我创建数据框时创建的索引 我假设我想删除索引,并创建日期和类别,然后对指标进行求和。如何在熊猫数据框中执行此操作? 在Ubuntu 12.04上,Python为2.7,熊猫为0.7.0。下面是我运行以下命令时遇到的错误 问题答案: 您可以在现有数据框上

  • 问题内容: 我正在使用带有NEST的C#.NET应用程序来创建索引。 我创建了一个Elasticsearch索引,客户可以查询该索引,称为index_1。然后,我使用应用程序的不同实例构建索引的另一个版本,并将其称为index_1_temp。 我将index_1_temp重命名为index_1然后删除原始index_1的最安全方法是什么? 我知道ES具有别名,但是我不确定如何将其用于此任务 编辑:

  • 来自ISO/IEC 9899:201x第5.1.2.3节程序执行第4段: 关于volatile对象,这里允许的优化是什么?有人能给出一个可以优化掉的易失性访问的例子吗? 由于Volatile访问是一种可观察的行为(在第6段中描述),似乎没有任何优化可以针对Volatile进行,所以,我很想知道第4节中允许的优化是什么。