【问题标题】:Find n nearest points with Solr in multi-dimensional space在多维空间中用 Solr 找到 n 个最近点
【发布时间】:2016-08-09 23:06:55
【问题描述】:

Solr 专家,非常感谢您就我的问题提供一些建议。

我想使用 Solr 构建一个多维空间,比如说 5 个维度。在这个空间中,应该有点,例如

P1 (0.3, 0.3, 0.3, 0.3, 0.3)
P2 (0.5, 0.5, 0.5, 0.5, 0.1)
P3 (0.5, 0.1, 0.1, 0.1, 0.1)

现在我想找到离给定点最近的点,例如

Px (0.5, 0.5, 0.5, 0.5, 0.5)

我试图找到有关多维空间搜索的可靠信息。但我找不到任何有帮助的东西。

在 Solr Wiki 中有一篇关于 Spatial Search 的文章。但他们只使用二维。

所以我的问题是:Solr 是否提供了多维空间搜索的功能?

【问题讨论】:

  • 我认为 Solr 无法处理二维以上的任何内容。但它可以处理表达式,您可以尝试将在 N 维空间中查找最近邻居的多种方法中的一种调整为 solr 可以理解的东西,但我认为它不会很快工作。我可以看到它工作的唯一另一种方法是将 5 个维度划分为 wolframalpha.com/input/?i=permutations+of+5+elements+taken+by+2 并将所有 20 个字段作为距离,并找到所有字段总和最小的一个
  • 我担心 Solr 不提供该功能。我认为将 5 个维度划分为排列的建议无法满足我们对性能的要求。不过,感谢您的宝贵回答。
  • 这在 lucene 中受支持。我仍在试图弄清楚如何在 solr 中做到这一点。 solr-start.com/javadoc/solr-lucene/org/apache/lucene/document/…

标签: solr nearest-neighbor n-dimensional


【解决方案1】:

您可以使用Principal component analysisT-distributed Stochastic Neighbor Embedding 将您的 5 维空间缩减为 2 维表示,然后您可以使用 Solr 为数据集上的任何点找到最近的邻居。

根据this question 的说法,t-SNE 似乎是最适合您的问题的选项。

有一个Python t-SNE tutorial here,但我认为这足以解决您的问题:

from sklearn.manifold import TSNE
X = np.array([ [0.3, 0.3, 0.3, 0.3, 0.3], [0.5, 0.5, 0.5, 0.5, 0.1], [0.5, 0.1, 0.1, 0.1, 0.1], [0.5, 0.5, 0.5, 0.5, 0.5] ])
reduced_points = TSNE(n_components=2, random_state=0, angle=.99, init='pca').fit_transform(X)
reduced_points = [ [int(x[0]*100), int(x[1]*100)] for x in reduced_points ]

然后您将在二维空间中获得积分。

>>> reduced_points
[[-21020, 2023], [-12745, -16097], [-2899, 10298], [5375, -7822]]

【讨论】:

    【解决方案2】:

    这在 Solr 中不受支持,但在 Lucene 中受支持。

    https://www.elastic.co/blog/lucene-points-6.0

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-18
      • 2018-11-25
      • 1970-01-01
      • 2017-10-16
      • 2012-09-22
      • 1970-01-01
      • 2020-05-01
      相关资源
      最近更新 更多