矢量匹配中的过滤条件

在 Vertex Matching Engine 中执行矢量匹配时,您可以使用布尔值规则将搜索限制为索引的子集。您可以指定布尔值谓词,告知匹配引擎在索引中忽略相似度搜索中的向量。

矢量属性

提供一个示例应用,它会对矢量数据库执行矢量相似度搜索。每个向量也是由多个属性类别(或命名空间)中的零个或多个属性(或令牌)描述的。

在此示例应用中,矢量标记为 colorshape

  • colorshape 是命名空间
  • redbluecolor 命名空间中的令牌
  • squarecircleshape 命名空间中的令牌

指定矢量特性

要在示例应用中指定矢量属性,请执行以下操作:

  • 如需指定“红色圆圈”:{color: red}, {shape: circle}
  • 如需指定“红色和蓝色方块”:{color: red, blue}, {shape: square}
  • 如需指定没有颜色的对象,只需在限制中不跳过“颜色”命名空间即可。

如需了解指定此数据的架构,请参阅“用于指定属性和命名空间的输入数据格式”部分。

查询

  • 指定 **{color: red, blue}, {shape: square, circle}** 的查询将匹配指定 **(red || blue) && (square || circle)** 的所有数据库点。查询会在所有命名空间中表示 AND,并且在每个命名空间内表示 OR。
  • 指定 **{color: red}** 的查询将匹配任何类型的所有 **red** 对象,对 **shape 没有任何限制。

拒绝名单

为了支持更高级的场景,我们支持特殊形式的否定,称为拒绝名单令牌。当查询拒绝列出令牌时,任何具有拒绝列表令牌的数据点都会包含匹配项。请注意,如果查询命名空间只有拒绝名单令牌,则所有未明确列入拒绝名单的点都将匹配 - 这与空命名空间与所有点的匹配完全相同。

数据点也可以拒绝令牌,从而排除与指定该令牌的任何查询的匹配。

下面列举了一些示例来说明过滤功能。我们来使用指定的令牌定义以下数据点:

  1. {} // 空集匹配所有内容

红色

// 只是一个“red”令牌

blue

// 只是一个“blue”令牌

orange

// 只是一个“orange”令牌

red, blue

// 多个令牌

red, !blue

// 拒绝“蓝色”令牌

red, blue, !blue

// 一个奇怪的边缘情况

!blue

// 仅限拒绝(类似于空集)

这是大多数人对系统期望的直观行为。

  • 空查询命名空间是全匹配通配符。例如,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"]}]}

Avro

Avro 记录的结构应与 JSON 格式定义类似。具体来说,它应该符合以下架构:

{
   "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": "crowding_tag", "type": ["null", "string"]}]
}

后续步骤