【发布时间】:2020-11-18 12:02:45
【问题描述】:
对于我们正在开发的应用程序,我们需要允许我们的搜索支持重音、不区分大小写和搜索部分单词。例如,给定我们集合中的产品名称“La Niña”,以下搜索应该会返回该条目:
- 拉尼娜现象
- 妮娜
- 妮娜
- 忍
- 拉宁
目前我已经尝试了两种方法,根据测试和一些研究,每种方法都有明显的局限性:
-
- 支持不区分大小写和部分搜索
- 不支持重音,例如 niña != nina
-
- 支持不区分大小写、重音和部分短语
- 不支持部分词
我们使用的正则表达式搜索示例:
function escapeRegExp(text) {
return text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
}
const escapedStr = this.escapeRegExp(searchTerm);
await Product.find({ name: new RegExp(`${escapedStr}`, 'i') });
我们使用的示例文本搜索:
// On the schema
storeSchema.index({ name: 'text' });
// Searching:
await Product.find($text: { $search: searchTerm })
.collation({locale: 'en', strength: 1});
顺便说一句,我们已将相关架构设置为使用排序强度级别 1。
如果 MongoDB 不提供解决方案,我正在考虑的一些方法:
- 阴影名称字段(不确定正确的术语?),已删除重音符号
- 独立的全文搜索引擎
有人可以帮忙吗?
注意,我们使用的是 mongoose 5.9.5,节点 12.16.2 和 mongodb 4.3.8 在 mongo 云中运行。
【问题讨论】: