初学者,找不到比较好的资料,如果方便的话给我说下比较简单易行的方案即可。
比如数据库某表的 name 字段中分别有: 张晓明 李晓明 王晓明 赵晓明 杨晓明 ......
在 HTML 前台页有个表单,用户输入“晓”或者“明”或者“晓明”,能够在即时弹出的下拉菜单中显示包含该关键字的 name 列表。这个 name 列表必须来自数据库(假设数据库有上千万条信息,缓存应该不行。)
比较简单易行的方案是什么?
效果类似于:
1
qiayue 2018-05-25 23:31:37 +08:00
上 Elasticsearch 吧
或者自己实现的思路: 1、对 name 所有数据分词,可以简单的按照长度分,比如 王小明 可以分为 王、小、明、王小、小明 2、对所有分词以及对应拼音及拼音首字母做索引 3、收到搜索请求,直接把输入的全部内容扔去找是否有对应的分词,找到索引,再找出 name 显示,每次显示 10 条足够 4、前端有个小经验,因为我们使用的是中文输入法,所以可以使用定时器形式,每 200 毫秒查看一次输入框内容是否变化,改变则向后端请求,同时前端可以缓存结果 |
3
opengps 2018-05-25 23:56:56 +08:00 via Android
lusence
|
4
dobelee 2018-05-26 00:25:53 +08:00 via Android
這個有維護一個關鍵詞詞庫。
lusence 和 es 已經是很成熟的方案了,可做到你說的千萬級數據瞬間響應。還想怎樣? |
5
Actrace 2018-05-26 00:34:54 +08:00
用 sphinx 来做索引器,从 sphinx 抽取你需要的数据。
|
6
swulling 2018-05-26 00:38:21 +08:00 via iPad
别上来就是几千万。。你初学就按照几千条设计,数据库模糊匹配即可。
|
7
mpich 2018-05-26 02:00:20 +08:00 1
你要实现百度这种,用前缀树就好了。
|
8
jingniao 2018-05-26 11:17:28 +08:00 via Android
数量级小(10w 以下)的话,前缀树放到内存中,查询速度杠杠的……
再多就不行了,考虑 ngram 数据库索引或者 es 吧 |
9
WilliamLin 2018-05-26 17:42:41 +08:00 via Android
数据量少,用数据库正则匹配,量大,那就上 lucene 这类的了
|
10
jaylong 2018-05-26 22:14:51 +08:00
DigitalOcean 的 support 搜索下拉超级赞
|