搜索下拉的解决方案

2018 年 5 月 25 日
 Eyon

初学者,找不到比较好的资料,如果方便的话给我说下比较简单易行的方案即可。

比如数据库某表的 name 字段中分别有: 张晓明 李晓明 王晓明 赵晓明 杨晓明 ......

在 HTML 前台页有个表单,用户输入“晓”或者“明”或者“晓明”,能够在即时弹出的下拉菜单中显示包含该关键字的 name 列表。这个 name 列表必须来自数据库(假设数据库有上千万条信息,缓存应该不行。)

比较简单易行的方案是什么?

效果类似于:

3652 次点击
所在节点    Python
11 条回复
qiayue
2018 年 5 月 25 日
上 Elasticsearch 吧

或者自己实现的思路:
1、对 name 所有数据分词,可以简单的按照长度分,比如 王小明 可以分为 王、小、明、王小、小明
2、对所有分词以及对应拼音及拼音首字母做索引
3、收到搜索请求,直接把输入的全部内容扔去找是否有对应的分词,找到索引,再找出 name 显示,每次显示 10 条足够
4、前端有个小经验,因为我们使用的是中文输入法,所以可以使用定时器形式,每 200 毫秒查看一次输入框内容是否变化,改变则向后端请求,同时前端可以缓存结果
Eyon
2018 年 5 月 25 日
@qiayue 谢谢,对于初学者,有比较好的现成方案,绝不重复造轮子。
opengps
2018 年 5 月 25 日
lusence
dobelee
2018 年 5 月 26 日
這個有維護一個關鍵詞詞庫。
lusence 和 es 已經是很成熟的方案了,可做到你說的千萬級數據瞬間響應。還想怎樣?
Actrace
2018 年 5 月 26 日
用 sphinx 来做索引器,从 sphinx 抽取你需要的数据。
swulling
2018 年 5 月 26 日
别上来就是几千万。。你初学就按照几千条设计,数据库模糊匹配即可。
mpich
2018 年 5 月 26 日
你要实现百度这种,用前缀树就好了。
jingniao
2018 年 5 月 26 日
数量级小(10w 以下)的话,前缀树放到内存中,查询速度杠杠的……
再多就不行了,考虑 ngram 数据库索引或者 es 吧
WilliamLin
2018 年 5 月 26 日
数据量少,用数据库正则匹配,量大,那就上 lucene 这类的了
jaylong
2018 年 5 月 26 日
DigitalOcean 的 support 搜索下拉超级赞
beggarvip
2018 年 5 月 27 日
@swulling 那还有学的必要吗?根本没应用场景啊

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/457865

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX