假设我们在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新特性,问题是上面提到的查询到底是怎么做的,又是做什么的。
1条答案
按热度按时间ltqd579y1#
首先,在Elasticsearch中搜索多个kNN字段尚不支持。
在这里,您可以找到尚未发布的与#91187和PR #92118问题相关的开发,这两个问题已合并为版本8.7...当前版本为8.6。
查看k-NN的OpenSearch文档,它似乎也不受支持。
但是,关于您提供的质询:
其中,
my_vector
是向量场的名称,而vector
是查询向量(即编码到相应向量中的查询文本),该查询向量必须具有与您搜索的向量场相同的维数。match
查询值没有定义好。这里是文档。function_score
的使用不清楚并且不正确。最后,如果您对OpenSearch的向量搜索感兴趣,我们最近编写了一个blog post,其中我们通过端到端测试体验详细描述了2.4.0版本引入的新神经搜索插件。