跳到主要内容

🦸‍♂️ 预过滤数据

信息

额外活动:如果你有多余时间或者在家进行,不会在动手实验中覆盖。

Atlas 中的向量搜索与 MongoDB 生态系统无缝集成是其中一个优点。例如,要进行向量搜索,我们使用聚合管道阶段,搜索后我们可以$project、限制数据等。但有时我们希望在运行语义搜索之前进行过滤。为此,我们可以在 $vectorSearch 中使用可选的 filter 属性。

使用数值字段进行预过滤

如果我们想预先过滤所有 2001 年的书籍,可以尝试以下(但目前不会生效):

[
{$vectorSearch: {
queryVector: vector,
path: "embeddings",
numCandidates: 100,
index: "vectorsearch",
limit: 100,
filter: {year: {$eq: 2001}}
}
}
]

使用字符串字段进行预过滤

我们可以尝试以下,同样不会生效:

[
{$vectorSearch: {
queryVector: vector,
path: "embeddings",
numCandidates: 100,
index: "vectorsearch",
limit: 100,
filter: {language: {$eq: "es"}}
}
}
]

问题出在 vectorsearch 索引,而不是这段代码。要对字符串字段进行预过滤,需要在我们的搜索索引定义中添加对这些字段的映射。为此,进入 MongoDB Atlas,进入你的集合并再次打开搜索索引选项卡,正如你在 创建索引 时所做的那样。

在这种情况下,我们已经有了索引,我们将要在 JSON 编辑器中编辑它。只需在索引中添加 year 字段和 language 字段的映射。索引应如下所示:

{
"fields": [
{
"type": "vector",
"path": "embeddings",
"numDimensions": 1536,
"similarity": "cosine"
},
{
"type": "filter",
"path": "year"
},
{
"type": "filter",
"path": "language"
}
]
}

唯一的区别是我们添加了以下部分,声明 yearlanguage 应作为 filter 进行索引。

    {
"type": "filter",
"path": "year"
},
{
"type": "filter",
"path": "language"
}

在代码中添加新的聚合管道(server/src/controllers/books.ts 中熟悉的 searchBooks 方法),进行搜索时,你会得到用西班牙语编写的语义结果。