有没有办法使用聚合管道在 Mongo 中查找"nearest"搜索值的 10 个文档?



这不适用于地理空间数据。

每个文档最多有10个整数值:

{ val1: 5,
val2: 8,
val3: -4,
...

如何找到10个文件";最近的";{ val1: 4, val2: -1, ...

我可以看到使用$addField为每个文档创建距离

{ $addFields: { distance: ($val1-4)^2 + ($val2+1)^2 ...

然后排序和$limit。。。

但我不确定这是否会起作用(尽管只有4万份文件(。。。

也许还有更好的方法?

如果没有任何预处理,就没有更好的方法了。如果你对数据分布有一些先验知识,你可以添加严格的规则来过滤初始匹配的大多数文档(如val1: {$lt: 11, $gt: 0}(,但如果返回的结果少于10个,你就必须再次查询。

这是一种非常常见的访问模式,已经有了一些生产级解决方案,我建议您选择其中一种,除非您想开发适合您需求的东西。

  1. 使用为矢量查询而构建的数据库,例如elasticsearch具有矢量类型,一旦对数据进行索引,它将为您提供具有各种距离公式的OOB搜索引擎功能。

  2. 允许降低查询的准确性,这与一些预处理方法相结合可以帮助查询时间,下面是一篇关于spotify如何处理这个问题的非常有趣的帖子。基本上将它们的数据划分为不同的集群,然后每个查询不需要扫描整个数据集。这再次损害了查询的准确性。

最新更新