Search 索引生命周期
从 v3.4.0 起,集合访问器和 Model 可以创建、查看、更新、删除并等待 MongoDB Search 索引。同一套接口同时支持全文 search 索引和 vectorSearch 索引;查询向量索引请使用 vectorSearch()。
环境要求
- MongoDB Atlas、带
mongot的 MongoDB Community / Enterprise 8.2+,或本地镜像mongodb/mongodb-atlas-local。 - 普通
mongod(包括mongodb-memory-server)不支持 Search 索引命令,调用会以SEARCH_INDEX_UNSUPPORTED拒绝。 - 服务端异步构建索引。create、update、drop 在服务端接受命令后即返回,需要结果时调用
waitForSearchIndex()。
API
Model 上有同样的 7 个方法。
行为
vectorSearch索引能否原地更新取决于部署环境。在所有实测环境中,服务端都不接受
updateSearchIndex命令带type字段(IDLUnknownField),带上也没有用。服务端拒绝时,monSQLize 原样透出为MONGODB_ERROR(带serverCode),不会自动降级。不能原地更新时,推荐用换名切换做到不中断:用新名字创建索引,
waitForSearchIndex(newName, { until: 'queryable' }),把查询切到新名字,再删除旧索引。期间两个索引同时存在,会额外占用资源,并计入索引数量上限(Atlas Free 档 3 个 Search 索引,Flex 档 10 个)。如果能接受短暂中断,也可以先删除索引、等待dropped、再重新创建;在它重新可查询之前检索会失败,中断时长随数据量增长(atlas-local 实测:50,000 文档 × 64 维约 1–2 秒)。
status 原样透传服务端的值。判断能否检索看 queryable,展示进度看 status。
索引类型
类型优先取服务端返回的顶层 type 字段(typeSource: 'server')。自建 mongot 不返回该字段(见 MongoDB 限制说明),此时根据 latestDefinition 推断(typeSource: 'inferred'):fields 数组中有 type: 'vector' 的项即为 vectorSearch,有 mappings 键即为 search。两者都没有时不返回 type,typeSource 为 'unknown',这类条目不会被 listSearchIndexes({ type }) 匹配。
waitForSearchIndex
超时以 SEARCH_INDEX_WAIT_TIMEOUT 拒绝,details[0].last 是最后一次观察到的状态。signal 中止时原样以 signal.reason 拒绝。
writePathPolicy
createSearchIndex、createSearchIndexes、updateSearchIndex、dropSearchIndex 与 createIndex() 一样属于 management 操作。在 model-only 且 management: 'inherit' 时,Model 调用放行,直接调用集合会以 INVALID_OPERATION 拒绝。读方法(listSearchIndexes、getSearchIndex、waitForSearchIndex)不受限制。
错误码
由服务端返回的错误都把驱动原错误放在 cause。没有专用码的服务端错误以 MONGODB_ERROR 拒绝,details[0] 带 serverCode、serverCodeName、serverMessage,并附加 error.monsqlize = { operation, namespace, indexName }。详见错误码参考。