【发布时间】:2020-05-31 07:28:48
【问题描述】:
我有一个产品索引。
每个产品都有多个变体(可以是几个或数百个,每个都有颜色和尺寸,例如红色)
每个变体都可以(以一定数量)在多个仓库(大约 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: {
...
}
}
这是我可能会收到的一种客户查询:
向我展示所有在 AB 和 XY 仓库的库存中有 Red.S 颜色的产品(最少 100 件)。
所以这可能是一个类似的过滤器
Red.S.AB > 100 AND Red.S.XY > 100
我没有在这里写完整的filter 查询,但它在弹性中很简单。
我们也可能得到 SUM 查询,例如AB 和 XY 的库存总和应该 > 500。
这很容易通过脚本过滤器,比如Red.S.AB + Red.S.XY > 500
问题是,给定 100 个仓库、100 种尺寸、25 种颜色,这很容易需要 100*100*25 = 250k 个映射。 Elasticsearch 根本无法处理那么多键。
简单的答案是使用嵌套文档,但是嵌套文档会带来一个特殊的问题。我们无法对给定的嵌套文档选择求和,而且嵌套文档很慢,特别是当我们每个产品要拥有 250k 时。
我也愿意接受外部解决方案而不是弹性解决方案。我们是 rails/postgres 堆栈。
【问题讨论】:
标签: elasticsearch