过滤矢量匹配

在 Vector Search 中,您可以使用布尔值规则将向量匹配搜索限制为部分索引。布尔值谓词会指示 Vector Search 要在索引中忽略哪些向量。 在本页面中,您将了解过滤的工作原理、查看示例,以及根据向量相似度高效地查询数据的方法。

借助 Vector Search,您可以按分类和数值限制来限制结果。添加限制(或“过滤”索引结果)由于多个原因非常有用,如以下示例所示:

  • 提高结果相关性:向量搜索是一种功能强大的工具,可用于查找语义上相似的项。过滤可用于从搜索结果中移除不相关的结果,例如语言、类别、价格或日期范围不正确的项。

  • 减少结果数量:向量搜索可能会返回大量结果,尤其是对于大型数据集。过滤可用于将结果数减少,更易于管理,同时仍然返回最相关的结果。

  • 细分结果:过滤可用于根据用户的个人需求和偏好对搜索结果进行个性化设置。例如,用户可能想要过滤结果,以仅包含他们在过去评分很高或位于特定价格范围内的商品。

矢量属性

在向量数据库上的向量相似度搜索中,每个向量都由零个或多个属性描述。这些属性称为令牌(用于令牌限制)和值(用于数字限制)。这些限制适用于多个属性类别(也称为命名空间)

在以下示例应用中,向量均标有 colorpriceshape

  • colorpriceshape 是命名空间
  • redbluecolor 命名空间中的令牌
  • squarecircleshape 命名空间中的令牌
  • 10050price 命名空间中的值

指定矢量特性

  • 如需指定“红色圆圈”:{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 没有任何限制。
  • 查询中的数字限制需要 namespacevalue_intvalue_floatvalue_double 中的一个数值和运算符 op
  • 运算符 opLESSLESS_EQUALEQUALGREATER_EQUALGREATER 之一。例如,使用 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.0], "restricts": [{"namespace": "class",
"allow": ["cat", "pet"]},{"namespace": "category", "allow": ["feline"]}]}
{"id": "43", "embedding": [0.6, 1.0], "restricts": [{"namespace":
"class", "allow": ["dog", "pet"]},{"namespace": "category", "allow":
["canine"]}]}
  • 对于每个向量的记录,添加一个名为 numeric_restricts 的字段,以包含一个对象数组,每个对象都是一个数字限制。

    • 每个对象都必须具有一个名为 namespace 的字段。 此字段是 NumericRestrictNamespace.namespace 命名空间。
    • 每个对象都必须具有 value_intvalue_floatvalue_double 之一。
    • 每个对象都必须具有一个名为 op 的字段。此字段仅用于查询。

下面是 JSON 格式的两个示例记录:

{"id": "42", "embedding": [0.5, 1.0], "numeric_restricts":
[{"namespace": "size", "value_int": 3},{"namespace": "ratio", "value_float": 0.1}]}
{"id": "43", "embedding": [0.6, 1.0], "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": "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

  • 词元限制

    • 对于每个向量的记录,添加以逗号分隔的 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
      }
      

后续步骤