ElasticSearch_KNN_Search多字段查询

d7v8vwbk  于 2022-10-06  发布在  ElasticSearch
关注(0)|答案(2)|浏览(232)

我使用的是ES 8.2。我想在多个向量上使用_knn_search的近似方法。下面,我将我当前的代码搜索附加到一个向量上。据我所知,_knn_search不支持对nested字段进行搜索。或者,我可以使用多索引搜索。一个索引、一个向量、一个搜索,将所有结果汇总在一起。然而,我需要将所有这些向量一起存储在一个索引中,因为我还需要对KNN搜索的向量以外的其他一些字段执行过滤。

因此,问题是,是否有解决方法来解决如何对多个向量执行_knn_search的问题?

search_vector = np.zeros(512).tolist()
es_query = {
        "knn": {
            "field": "feature_vector_1.vector",
            "query_vector": search_vector,
            "k": 100,
            "num_candidates": 1000
        },
        "filter": [
            {
                "range": {
                    "feature_vector_1.match_prc": {
                        "gt": 10
                    }
                }
            }
        ],
    "_source": {
        "excludes": ["feature_vector_1.vector", "feature_vector_2.vector"]
    }
    }
sh7euo9m

sh7euo9m1#

我最后得到的最后一个工作查询是

es_query = {
            "knn": {
                "field": "feature_vector_1.vector",
                "query_vector": search_vector,
                "k": 1000,
                "num_candidates": 1000
            },
            "filter": [
                {
                    "function_score": {
                        "query": {
                            "match_all": {}
                        },
                        "script_score": {
                            "script": {
                                "source": """
                                                  double value = dotProduct(params.queryVector, 'feature_vector_2.vector');
                                                  return 100 * (1 + value) / 2;
                                                """,
                                "params": {
                                    "queryVector": search_vector
                                }
                            },
                        }
                    }
                }
            ],
        "_source": {
            "excludes": ["feature_vector_1.vector", "feature_vector_2.vector"]
          }
        }

然而,在两个向量上AKNN不是真的,但如果这样的查询的性能满足您的期望,它仍然是工作选项。

hk8txs48

hk8txs482#

下面的方法似乎适用于我组合KNN搜索,取多个余弦相似度得分的平均值。注意,这与原始请求略有不同,因为它执行暴力搜索,但您仍然可以通过替换match_all位来预先过滤结果。

GET my-index/_search
{
  "query": {
    "script_score": {
      "query": {
        "match_all": {}
      },
      "script": {
        "source": "(cosineSimilarity(params.vector1, 'my-vector1') + cosineSimilarity(params.vector2, 'my-vector2'))/2 + 1.0",
        "params": {
          "vector1": [
            1.3012068271636963,
            ...
            0.23468133807182312
          ],
          "vector2": [
            -0.49404603242874146,
            ...
            -0.15835021436214447
          ]
        }
      }
    }
  }
}

相关问题