搜索下拉的解决方案

2018-05-25 23:21:40 +08:00
 Eyon

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

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

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

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

效果类似于:

2823 次点击
所在节点    Python
11 条回复
qiayue
2018-05-25 23:31:37 +08:00
上 Elasticsearch 吧

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

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

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

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

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

© 2021 V2EX