MongoDB Atlas autocomplete复合查询报Unrecognized index Error排查
问题场景
计划基于MongoDB Atlas实现compound自动补全搜索功能,已在Atlas控制台创建对应搜索索引,并在API代码中配置了索引参数。
问题描述
通过Insomnia接口测试工具发起搜索请求时,接口返回*Unrecognized index(索引无法识别)*错误,需排查代码配置问题。
问题原因
代码存在两处核心配置错误,不符合MongoDB Atlas Search的语法规则:
index参数位置错误:index字段必须定义在$search阶段的最外层,单个$search阶段仅支持引用一个搜索索引,不能嵌套在compound的子查询中分别指定多个索引名。should数组结构错误:compound下的should参数接收独立查询子句构成的数组,原代码将用户名、城市两个autocomplete查询的属性写在同一个对象中,同对象内重名的index、autocomplete字段会被后写入的配置覆盖,实际仅最后一段配置生效。- 额外注意:需要提前将
name、city两个需要搜索的字段,都配置在同一个Atlas搜索索引的字段映射中,无法在单次聚合查询中同时调用两个独立的搜索索引。
原问题代码
router.get('/searchuser', userController.userNameCitySearchAutocomplete); //autocomplete search on user name and city exports.userNameCitySearchAutocomplete = async function (req, res) { try { const { userNameCityQueryparam } = req.query; console.log("search query param", userNameCityQueryparam); const agg = [ { $search: { 'compound': { "should": [{ //search on user name index: "userName", autocomplete: { query: userNameCityQueryparam, path: 'name', fuzzy: { maxEdits: 2, prefixLength: 3 } }, //search on user city index: "userCity", autocomplete: { query: userNameCityQueryparam, path: 'city', fuzzy: { maxEdits: 2, prefixLength: 3 } }, }] } } } ] const response = await User.aggregate(agg); return res.json(response); // res.send(response); } catch (error) { console.log("autocomplete search error", error); return res.json([]); } };
修复后代码
router.get('/searchuser', userController.userNameCitySearchAutocomplete); // 用户名+城市复合自动补全搜索 exports.userNameCitySearchAutocomplete = async function (req, res) { try { const { userNameCityQueryparam } = req.query; console.log("search query param", userNameCityQueryparam); const agg = [ { $search: { // 索引配置放在$search最外层,替换为你实际创建的、同时包含name和city字段映射的索引名 index: "userSearch", compound: { should: [ // 用户名自动补全子句 { autocomplete: { query: userNameCityQueryparam, path: 'name', fuzzy: { maxEdits: 2, prefixLength: 3 } } }, // 城市自动补全子句 { autocomplete: { query: userNameCityQueryparam, path: 'city', fuzzy: { maxEdits: 2, prefixLength: 3 } } } ] } } } ] const response = await User.aggregate(agg); return res.json(response); } catch (error) { console.log("autocomplete search error", error); return res.json([]); } };
相关截图


内容的提问来源于stack exchange,提问作者Bhol
相关产品推荐
相关产品推荐

