繁体   English   中英

使用 MongoDB 自动完成

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM