ElasticSearch _knn_search 查询多个字段答案

作者: 分类: 编程代码 时间:1970-01-01

ElasticSearch _knn_search 查询多个字段答案

ElasticSearch _knn_search query on multiple fieldsElasticSearch _knn_search 查询多个字段

我正在使用 ES 8.2。我想在超过 1 个向量上使用 _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"]
    }
    }

【问题讨论】:

标签: elasticsearch elastic-stack knn elk


【解决方案1】:

我最终得到的最后一个有效查询是

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"]
          }
        }

但是,在 2 个向量上不是真正的 AKNN,但如果此类查询的性能满足您的期望,它仍然可以工作。

【讨论】:

    【解决方案2】:

    您必须在弹性之外计算输入嵌入的质心,并将结果用作您的输入。

    【讨论】: