You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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搜索的结合。

示例:

  1. 创建索引(包含向量字段与过滤字段):
PUT /my_index
{
  "mappings": {
    "properties": {
      "vector": {
        "type": "knn_vector",
        "dimension": 3,
        "method": {
          "name": "hnsw",
          "space_type": "l2"
        }
      },
      "category": {
        "type": "keyword"
      }
    }
  }
}
  1. 插入测试文档:
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"
}
  1. 带过滤的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搜索实现精准过滤。

示例:

  1. 创建嵌套结构索引:
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"
          }
        }
      }
    }
  }
}
  1. 插入多向量文档:
POST /my_nested_index/_doc/1
{
  "nested_vectors": [
    {
      "vector": [1, 2, 3],
      "attribute": "red"
    },
    {
      "vector": [4, 5, 6],
      "attribute": "blue"
    }
  ]
}
  1. 嵌套字段的带过滤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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 22:25:15