【问题标题】:Is there an Algorithm in ElasticSearch which gives similarity between vectors?ElasticSearch 中是否有一种算法可以给出向量之间的相似性?
【发布时间】:2021-04-06 18:33:37
【问题描述】:

在开始之前,我真的不知道 Elastic 是什么以及它是如何工作的。我是 ML 工程师,最近被分配了Image - Image similarity 的任务。我开发了一个模型,该模型将为每个图像提供一个向量,然后我必须比较模型提供的向量之间的距离,例如Manhattan, Euclidean, cosine etc。我可以很容易地做到这一点,但问题是我有大约 20M 图像的大量数据,我无法将所有向量存储在内存中以供初学者使用,即使我这样做了,我实际上也无法与每个单元进行比较将是O(12M) 比较。

所以我想知道有没有用于向量搜索的算法,只是有像Okapi BM25 这样的文本搜索算法。

我的向量看起来像: [0.2,0.1,0.04,......] 等。根据用例,它们可以是任何尺寸。但是有什么算法可以让我top-k搜索结果。

如果需要信息,我们的团队正在使用MongoDB

【问题讨论】:

    标签: mongodb elasticsearch machine-learning deep-learning elastic-stack


    【解决方案1】:

    我认为,自 7.7 版以来,Elasticsearch 可以“开箱即用”(如 - 无需插件)执行余弦相似度。还有实现其他算法的插件,但我没有任何经验。请记住,elasticsearch 的 CPU 和磁盘 I/O 非常繁重,因此对于非常大的数据集,余弦相似度可能会很慢。 由于你对ES一点也不熟悉,这里就不多说了,你得先学会怎么用。

    如果您的数据已经在 MongoDB 中,您需要在 Elasticsearch 中使用“dense_vector”数据类型索引 JSON 文档,然后您可以使用 cosine_similarity 内置函数。

    【讨论】:

      【解决方案2】:

      我也在使用 Elasticsearch 来搜索类似的图像。 这是我的示例查询。(它计算相似度分数)

      script_query = {
              "script_score": {
                  "query": {
                      "bool": {
                          "must": [
                              {"match": {"property1": a}},
                              {"match": {"property2": b}}]}},
                  "script": {
                      "source": "cosineSimilarity(params.query_vector, 'fvec') + 1.0",
                      "params": {"query_vector": fvec}
                  }
              }
          }
      

      【讨论】:

      • 需要多少时间?我认为 ElasticSearch 需要 O(n) 时间。 1 与其他比较。您的算法需要多少时间?
      猜你喜欢
      • 1970-01-01
      • 2013-12-16
      • 2015-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-22
      • 2020-02-24
      相关资源
      最近更新 更多