如何使用MongoDB与Express.js实现搜索/自动补全功能
姓名前缀自动补全功能实现方案
以下根据你的数据量级和查询需求,提供几种可落地的实现方式:
1. 小数据量级(万级用户以内)
直接用数据库前缀模糊查询即可,性能足够:
- 注意不要使用
%关键词%全模糊查询,会导致索引失效,仅用关键词%前缀匹配即可命中普通B树索引 - MySQL示例查询语句:
SELECT name FROM users WHERE name LIKE 'leo%' - MongoDB示例查询语句:
db.users.find({name: /^leo/})
2. 中等数据量级(十万级用户以内,需支持子串匹配)
如果需要支持中间字符匹配(比如输入"mes"也能返回"leonel messi"),可以使用数据库ngram全文索引:
- MySQL 5.7以上版本支持ngram全文解析器,创建索引时指定
WITH PARSER ngram,查询时用MATCH(name) AGAINST('leo')即可实现任意子串匹配,不需要输入完整词汇 - MongoDB 4.2以上版本支持ngram文本索引,创建索引时配置
ngram: {min: 1, max: 10}参数,即可实现部分字符匹配
3. 大数据量级/高并发场景(十万级用户以上,QPS较高)
建议使用专门的自动补全方案,性能更强:
- Redis Sorted Set方案:将所有用户名的所有前缀拆分存入Sorted Set,分值统一设为0,查询时先找到输入关键词在zset中的排名,向后遍历即可快速拿到匹配的完整姓名,性能可支撑万级QPS
- Elasticsearch方案:给姓名字段设置
completion suggester类型,原生支持自动补全场景,可配置模糊匹配、权重排序规则,是工业界最常用的自动补全实现方案
所有方案都可叠加自定义排序逻辑,比如将姓名匹配度更高、用户活跃度更高的结果排在前列,优化用户搜索体验。
内容的提问来源于stack exchange,提问作者darkstar
相关产品推荐
相关产品推荐

