[英]Autocomplete with MongoDB
我对 MongoDB 和自动完成有一些问题,我想像 SQL => 一样做一些事情,但在 MongoDB(MongoDB 4.4 Percona 版本)上。
我有一个包含 170 万个城市的数据库和一个分片的副本集。
我尝试了 Mongo => filter.Text
但结果运行不正常但结果非常快,例如我正在寻找城市Barcelona
,当我写 'barc' 时我得到 1 或 2 个结果但不是Barcelona
,我需要在自动完成中写 'barcelona' 以获得Barcelona
。
然后我尝试使用正则表达式,这一次自动完成功能正在工作,但速度很慢,比如我添加的每个字母都有 1 到 2 秒的延迟。
有没有办法使用 filter.text 与“startwith”或正则表达式解决方案一起使用,但每个字母之间(几乎)没有延迟?
您最好的选择是实现某种形式的缓存。 问题是,你有相当数量的数据到 go 并且你不能使用文本索引,因为它不支持部分单词搜索。
因此,对于搜索解决方案本身,您应该尽可能地优化正则表达式。 由于您只对字符串的开头感兴趣,这应该足够了:
const searchTerm = 'term';
db.collection.find({ name: {'$regex' : `^${searchTerm}`, '$options' : 'i'}});
这将执行不区分大小写的搜索。 另外,请注意Tarmo的评论,尤其是去抖动部分。
你也应该考虑变音符号。 如果您需要处理它们,则需要为搜索提供排序规则:
const searchTerm = 'term';
db.collection.find({name: {'$regex' : `^${searchTerm}`}}).collation({locale: "en", strength: 1});
通过提供strength
1
,您将忽略区分大小写和变音符号。
在任何情况下,这都不是一个轻量级的操作,尤其是对于这样的设置大小。 最后,就像我说的那样,如果频繁调用此自动完成功能 - 您应该在顶部应用缓存机制(因为我怀疑底层数据是否经常更改或实际上根本不更改)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.