OpenSearch 1.3中多向量文档带过滤的k-NN搜索实现方案咨询
在OpenSearch 1.3中实现带过滤的多向量文档k-NN搜索
OpenSearch 1.3不支持在k-NN查询内部直接使用filter参数(该特性为2.13版本新增),但可以通过以下两种方式实现多向量文档带过滤的k-NN搜索:
方法1:用bool查询组合k-NN搜索与过滤条件
将k-NN搜索放在bool查询的must子句中,过滤条件放在filter子句中,实现过滤与k-NN搜索的结合。
示例:
- 创建索引(包含向量字段与过滤字段):
PUT /my_index { "mappings": { "properties": { "vector": { "type": "knn_vector", "dimension": 3, "method": { "name": "hnsw", "space_type": "l2" } }, "category": { "type": "keyword" } } } }
- 插入测试文档:
POST /my_index/_doc/1 { "vector": [1, 2, 3], "category": "electronics" } POST /my_index/_doc/2 { "vector": [4, 5, 6], "category": "books" } POST /my_index/_doc/3 { "vector": [7, 8, 9], "category": "electronics" }
- 带过滤的k-NN查询:
POST /my_index/_search { "query": { "bool": { "must": [ { "knn": { "vector": { "vector": [1, 2, 3], "k": 2 } } } ], "filter": [ { "term": { "category": "electronics" } } ] } } }
该查询会先筛选出category为electronics的文档,再在这些文档中执行k-NN搜索,返回最相似的2个结果。
方法2:嵌套字段结构实现多向量+过滤
如果文档包含多组“向量+专属属性”的组合,可使用嵌套字段结构,通过nested查询结合k-NN搜索实现精准过滤。
示例:
- 创建嵌套结构索引:
PUT /my_nested_index { "mappings": { "properties": { "nested_vectors": { "type": "nested", "properties": { "vector": { "type": "knn_vector", "dimension": 3, "method": { "name": "hnsw", "space_type": "l2" } }, "attribute": { "type": "keyword" } } } } } }
- 插入多向量文档:
POST /my_nested_index/_doc/1 { "nested_vectors": [ { "vector": [1, 2, 3], "attribute": "red" }, { "vector": [4, 5, 6], "attribute": "blue" } ] }
- 嵌套字段的带过滤k-NN查询:
POST /my_nested_index/_search { "query": { "nested": { "path": "nested_vectors", "query": { "bool": { "must": [ { "knn": { "nested_vectors.vector": { "vector": [1, 2, 3], "k": 1 } } } ], "filter": [ { "term": { "nested_vectors.attribute": "red" } } ] } }, "inner_hits": {} } } }
该查询会在嵌套字段中筛选出attribute为red的条目,再执行k-NN搜索,通过inner_hits返回匹配的嵌套条目详情。
关键说明
OpenSearch 1.3的k-NN查询不支持内部嵌套filter对象,必须通过外部bool查询或nested查询将过滤条件与k-NN搜索组合,这是与2.13版本的核心差异。
内容的提问来源于stack exchange,提问作者Ben Dilts
相关产品推荐
相关产品推荐

