在 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