在 Vector Search 中,您可以使用布尔值规则将向量匹配搜索限制为部分索引。布尔值谓词会指示 Vector Search 要在索引中忽略哪些向量。 在本页面中,您将了解过滤的工作原理、查看示例,以及根据向量相似度高效地查询数据的方法。
借助 Vector Search,您可以按分类和数值限制来限制结果。添加限制(或“过滤”索引结果)由于多个原因非常有用,如以下示例所示:
提高结果相关性:向量搜索是一种功能强大的工具,可用于查找语义上相似的项。过滤可用于从搜索结果中移除不相关的结果,例如语言、类别、价格或日期范围不正确的项。
减少结果数量:向量搜索可能会返回大量结果,尤其是对于大型数据集。过滤可用于将结果数减少,更易于管理,同时仍然返回最相关的结果。
细分结果:过滤可用于根据用户的个人需求和偏好对搜索结果进行个性化设置。例如,用户可能想要过滤结果,以仅包含他们在过去评分很高或位于特定价格范围内的商品。
矢量属性
在向量数据库上的向量相似度搜索中,每个向量都由零个或多个属性描述。这些属性称为令牌(用于令牌限制)和值(用于数字限制)。这些限制适用于多个属性类别(也称为命名空间)。
在以下示例应用中,向量均标有 color、price 和 shape:
color、price和shape是命名空间。red和blue是color命名空间中的令牌。square和circle是shape命名空间中的令牌。100和50是price命名空间中的值。
指定矢量特性
- 如需指定“红色圆圈”:
{color: red}, {shape: circle}。 - 如需指定“红色或蓝色方块”:
{color: red, blue}, {shape: square}。 - 如需指定没有颜色的对象,请省略 
restricts字段中的“颜色”命名空间。 - 要为对象指定数字限制,请记下命名空间和类型相应字段中的值。整数值应在 
value_int中指定,浮点值应在value_float中指定,双精度值应在value_double中指定。对于给定的命名空间,只应使用一种数字类型。 
如需了解用于指定此数据的架构,请参阅在输入数据中指定命名空间和令牌。
查询
- 查询会在跨命名空间时表示 AND 逻辑运算符,在每个命名空间内则表示 OR 逻辑运算符。指定 
{color: red, blue}, {shape: square, circle}的查询会匹配满足(red || blue) && (square || circle)的所有数据库点。 - 指定 
{color: red}的查询会匹配任何类型的所有red对象,对shape没有任何限制。 - 查询中的数字限制需要 
namespace、value_int、value_float和value_double中的一个数值和运算符op。 - 运算符 
op是LESS、LESS_EQUAL、EQUAL、GREATER_EQUAL、GREATER之一。例如,使用LESS_EQUAL运算符时,如果数据点的值小于或等于查询中使用的值,则数据点符合条件。 
以下代码示例标识示例应用中的向量属性:
[
  {
    "namespace": "price",
    "value_int": 20,
    "op": "LESS"
  },
  {
    "namespace": "length",
    "value_float": 0.3,
    "op": "GREATER_EQUAL"
  },
  {
    "namespace": "width",
    "value_double": 0.5,
    "op": "EQUAL"
  }
]
拒绝名单
为了支持更高级的场景,Google 支持一种称为拒绝名单令牌的否定形式。当查询将某个令牌列入拒绝名单时,系统会排除具有已列入拒绝名单的令牌的任何数据点的匹配项。如果查询命名空间仅包含列入拒绝名单的令牌,则所有未明确列入拒绝名单的点都会匹配,这与空命名空间与所有点的匹配完全相同。
数据点也可以将令牌列入拒绝名单,从而排除与指定该令牌的任何查询的匹配。
例如,使用指定的令牌定义以下数据点:
A: {}                  // empty set matches everything
B: {red}               // only a 'red' token
C: {blue}              // only a 'blue' token
D: {orange}            // only an 'orange' token
E: {red, blue}         // multiple tokens
F: {red, !blue}        // deny the 'blue' token
G: {red, blue, !blue}  // An unlikely edge-case
H: {!blue}             // deny-only (similar to empty-set)
系统的行为如下:
- 空查询命名空间是全匹配通配符。例如,Q:
{}与 DB:{color:red}匹配。 空数据点命名空间并非“全部匹配”的通配符。例如,Q:
{color:red}与 DB:{}则不匹配。
在输入数据中指定命名空间和令牌或值
如需了解如何从整体上设计输入数据的结构,请参阅输入数据格式和结构。
以下标签页展示了如何指定与每个输入矢量关联的命名空间和令牌。
JSON
对于每条矢量的记录,请添加一个名为
restricts的字段,以包含一个对象数组,其中每个对象都是一个命名空间。- 每个对象都必须具有一个名为 
namespace的字段。 此字段是TokenNamespace.namespace命名空间。 allow字段的值(如果存在)是一个字符串数组。此字符串数组是TokenNamespace.string_tokens列表。deny字段的值(如果存在)是一个字符串数组。此字符串数组是TokenNamespace.string_denylist_tokens列表。
- 每个对象都必须具有一个名为 
 
下面是 JSON 格式的两个示例记录:
[
  {
    "id": "42",
    "embedding": [
      0.5,
      1
    ],
    "restricts": [
      {
        "namespace": "class",
        "allow": [
          "cat",
          "pet"
        ]
      },
      {
        "namespace": "category",
        "allow": [
          "feline"
        ]
      }
    ]
  },
  {
    "id": "43",
    "embedding": [
      0.6,
      1
    ],
    "sparse_embedding": {
      "values": [
        0.1,
        0.2
      ],
      "dimensions": [
        1,
        4
      ]
    },
    "restricts": [
      {
        "namespace": "class",
        "allow": [
          "dog",
          "pet"
        ]
      },
      {
        "namespace": "category",
        "allow": [
          "canine"
        ]
      }
    ]
  }
]
对于每个向量的记录,添加一个名为
numeric_restricts的字段,以包含一个对象数组,每个对象都是一个数字限制。- 每个对象都必须具有一个名为 
namespace的字段。 此字段是NumericRestrictNamespace.namespace命名空间。 - 每个对象都必须具有 
value_int、value_float和value_double之一。 - 每个对象都必须具有一个名为 
op的字段。此字段仅用于查询。 
- 每个对象都必须具有一个名为 
 
下面是 JSON 格式的两个示例记录:
[
  {
    "id": "42",
    "embedding": [
      0.5,
      1
    ],
    "numeric_restricts": [
      {
        "namespace": "size",
        "value_int": 3
      },
      {
        "namespace": "ratio",
        "value_float": 0.1
      }
    ]
  },
  {
    "id": "43",
    "embedding": [
      0.6,
      1
    ],
    "sparse_embedding": {
      "values": [
        0.1,
        0.2
      ],
      "numeric_restricts": [
        {
          "namespace": "weight",
          "value_double": 0.3
        }
      ]
    }
  }
]
Avro
Avro 记录使用以下架构:
{
  "type": "record",
  "name": "FeatureVector",
  "fields": [
    {
      "name": "id",
      "type": "string"
    },
    {
      "name": "embedding",
      "type": {
        "type": "array",
        "items": "float"
      }
    },
    {
      "name": "sparse_embedding",
      "type": [
        "null",
        {
          "type": "record",
          "name": "sparse_embedding",
          "fields": [
            {
              "name": "values",
              "type": {
                "type": "array",
                "items": "float"
              }
            },
            {
              "name": "dimensions",
              "type": {
                "type": "array",
                "items": "long"
              }
            }
          ]
        }
      ]
    },
    {
      "name": "restricts",
      "type": [
        "null",
        {
          "type": "array",
          "items": {
            "type": "record",
            "name": "Restrict",
            "fields": [
              {
                "name": "namespace",
                "type": "string"
              },
              {
                "name": "allow",
                "type": [
                  "null",
                  {
                    "type": "array",
                    "items": "string"
                  }
                ]
              },
              {
                "name": "deny",
                "type": [
                  "null",
                  {
                    "type": "array",
                    "items": "string"
                  }
                ]
              }
            ]
          }
        }
      ]
    },
    {
      "name": "numeric_restricts",
      "type": [
        "null",
        {
          "type": "array",
          "items": {
            "name": "NumericRestrict",
            "type": "record",
            "fields": [
              {
                "name": "namespace",
                "type": "string"
              },
              {
                "name": "value_int",
                "type": [ "null", "int" ],
                "default": null
              },
              {
                "name": "value_float",
                "type": [ "null", "float" ],
                "default": null
              },
              {
                "name": "value_double",
                "type": [ "null", "double" ],
                "default": null
              }
            ]
          }
        }
      ],
      "default": null
    },
    {
      "name": "crowding_tag",
      "type": [
        "null",
        "string"
      ]
    }
  ]
}
CSV
token 限制
对于每个向量的记录,添加以逗号分隔的
name=value格式对,以指定词元命名空间限制。如果命名空间中有多个值,则同一名称可以重复。例如,
color=red,color=blue表示此TokenNamespace:{ "namespace": "color" "string_tokens": ["red", "blue"] }对于每个向量的记录,请添加以逗号分隔的
name=!value格式对,以指定词元命名空间限制的排除值。例如,
color=!red表示此TokenNamespace:{ "namespace": "color" "string_blacklist_tokens": ["red"] }
数字限制
对于每个向量的记录,添加带有数字类型后缀的以逗号分隔的
#name=numericValue格式对,以指定数字命名空间限制。数字类型后缀为
i(表示 int)、f(表示浮点)和d(表示双精度)。同一名称不应重复,因为每个命名空间应该有一个关联的值。例如,
#size=3i表示此NumericRestrictNamespace:{ "namespace": "size" "value_int": 3 }#ratio=0.1f表示此NumericRestrictNamespace:{ "namespace": "ratio" "value_float": 0.1 }#weight=0.3d表示此NumericRestriction:{ "namespace": "weight" "value_double": 0.3 }以下示例数据点具有
id: "6"、embedding: [7, -8.1]、sparse_embedding: {values: [0.1, -0.2, 0.5]、dimensions: [40, 901, 1111]}}、拥挤标记test、token 许可名单color: red, blue、token 拒绝名单color: purple,以及数值限制ratio和浮点0.1:6,7,-8.1,40:0.1,901:-0.2,1111:0.5,crowding_tag=test,color=red,color=blue,color=!purple, ratio=0.1f