elasticsearch OpenSearch中k近邻多字段搜索

u5rb5r59  于 2023-02-18  发布在  ElasticSearch
关注(0)|答案(1)|浏览(197)

假设我们在OpenSearch中有这个索引:

{
    "settings": {
        "index.knn": True,
        "number_of_replicas": 0,
        "number_of_shards": 1,
    },
    "mappings": {
        "properties": {
            "title": {"type": "text"},
            "tag": {"type": "text"},
            "e1": {
                "type": "knn_vector",
                "dimension": 512,
                "method": {
                    "name": "hnsw",
                    "space_type": "cosinesimil",
                    "engine": "nmslib",
                    "parameters": {"ef_construction": 512, "m": 24},
                },
            },
            "e2": {
                "type": "knn_vector",
                "dimension": 512,
                "method": {
                    "name": "hnsw",
                    "space_type": "cosinesimil",
                    "engine": "nmslib",
                    "parameters": {"ef_construction": 512, "m": 24},
                },
            },
            "e3": {
                "type": "knn_vector",
                "dimension": 512,
                "method": {
                    "name": "hnsw",
                    "space_type": "cosinesimil",
                    "engine": "nmslib",
                    "parameters": {"ef_construction": 512, "m": 24},
                },
            },
        }
    },
}

我们想在所有的域上执行搜索(向量域近似为knn),在OpenSearch中做这件事的正确方法是什么?
我有这样的查询,工作,但我不知道这是否是正确的方式做这件事,如果它使用近似knn:

{
    "size": 10,
    "query": {
        "bool": {
            "should": [
                {
                    "function_score": {
                        "query": {
                            "knn": {
                                "e1": {
                                    "vector": [0, 1, 2, 3],
                                    "k": 10,
                                },
                            }
                        },
                        "weight": 1,
                    }
                },
                {
                    "function_score": {
                        "query": {
                            "knn": {
                                "e2": {
                                    "vector": [0, 1, 2, 3],
                                    "k": 10,
                                },
                            }
                        },
                        "weight": 1,
                    }
                },
                {
                    "function_score": {
                        "query": {
                            "knn": {
                                "e3": {
                                    "vector": [0, 1, 2, 3],
                                    "k": 10,
                                },
                            }
                        },
                        "weight": 1,
                    }
                },
                {
                    "function_score": {
                        "query": {
                            "match": {"title": "title"}
                        },
                        "weight": 0.1,
                    }
                },
                {
                    "function_score": {
                        "query": {"match": {"tag": "tag"}},
                        "weight": 0.1,
                    }
                },
            ]
        }
    },
    "_source": False,
}

换句话说,我想知道这是如何为ElasticSearch可以在OpenSearch中完成。
编辑1:我想在OpenSearch中做这个Elasticsearch新特性,问题是上面提到的查询到底是怎么做的,又是做什么的。

ltqd579y

ltqd579y1#

首先,在Elasticsearch中搜索多个kNN字段尚不支持。
在这里,您可以找到尚未发布的与#91187和PR #92118问题相关的开发,这两个问题已合并为版本8.7...当前版本为8.6。
查看k-NN的OpenSearch文档,它似乎也不受支持。
但是,关于您提供的质询:

  • knn搜索没有很好地定义...正确的方法是,例如:
{
  "query": {
    "knn": {
      "my_vector": {
        "vector": [2, 3, 5, 6],
        "k": 2
      }
    }
  }
}

其中,my_vector是向量场的名称,而vector是查询向量(即编码到相应向量中的查询文本),该查询向量必须具有与您搜索的向量场相同的维数。

  • match查询值没有定义好。这里是文档。
  • function_score的使用不清楚并且不正确。

最后,如果您对OpenSearch的向量搜索感兴趣,我们最近编写了一个blog post,其中我们通过端到端测试体验详细描述了2.4.0版本引入的新神经搜索插件。

相关问题