这不适用于地理空间数据。
每个文档最多有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个,你就必须再次查询。
这是一种非常常见的访问模式,已经有了一些生产级解决方案,我建议您选择其中一种,除非您想开发适合您需求的东西。
-
使用为矢量查询而构建的数据库,例如
elasticsearch
具有矢量类型,一旦对数据进行索引,它将为您提供具有各种距离公式的OOB搜索引擎功能。 -
允许降低查询的准确性,这与一些预处理方法相结合可以帮助查询时间,下面是一篇关于spotify如何处理这个问题的非常有趣的帖子。基本上将它们的数据划分为不同的集群,然后每个查询不需要扫描整个数据集。这再次损害了查询的准确性。