🦸♂️ 预过滤数据
信息
额外活动:如果你有多余 时间或者在家进行,不会在动手实验中覆盖。
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"
}
]
}
唯一的区别是我们添加了以下部分,声明 year
和 language
应作为 filter 进行索引。
{
"type": "filter",
"path": "year"
},
{
"type": "filter",
"path": "language"
}
在代码中添加新的聚合管道(server/src/controllers/books.ts
中熟悉的 searchBooks
方法),进行搜索时,你会得到用西班牙语编写的语义结果。