V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Eyon
V2EX  ›  Python

搜索下拉的解决方案

  •  
  •   Eyon · 2018-05-25 23:21:40 +08:00 · 2958 次点击
    这是一个创建于 2380 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    效果类似于:

    11 条回复    2018-05-27 10:35:43 +08:00
    qiayue
        1
    qiayue  
       2018-05-25 23:31:37 +08:00
    上 Elasticsearch 吧

    或者自己实现的思路:
    1、对 name 所有数据分词,可以简单的按照长度分,比如 王小明 可以分为 王、小、明、王小、小明
    2、对所有分词以及对应拼音及拼音首字母做索引
    3、收到搜索请求,直接把输入的全部内容扔去找是否有对应的分词,找到索引,再找出 name 显示,每次显示 10 条足够
    4、前端有个小经验,因为我们使用的是中文输入法,所以可以使用定时器形式,每 200 毫秒查看一次输入框内容是否变化,改变则向后端请求,同时前端可以缓存结果
    Eyon
        2
    Eyon  
    OP
       2018-05-25 23:44:49 +08:00
    @qiayue 谢谢,对于初学者,有比较好的现成方案,绝不重复造轮子。
    opengps
        3
    opengps  
       2018-05-25 23:56:56 +08:00 via Android
    lusence
    dobelee
        4
    dobelee  
       2018-05-26 00:25:53 +08:00 via Android
    這個有維護一個關鍵詞詞庫。
    lusence 和 es 已經是很成熟的方案了,可做到你說的千萬級數據瞬間響應。還想怎樣?
    Actrace
        5
    Actrace  
       2018-05-26 00:34:54 +08:00
    用 sphinx 来做索引器,从 sphinx 抽取你需要的数据。
    swulling
        6
    swulling  
       2018-05-26 00:38:21 +08:00 via iPad
    别上来就是几千万。。你初学就按照几千条设计,数据库模糊匹配即可。
    mpich
        7
    mpich  
       2018-05-26 02:00:20 +08:00   ❤️ 1
    你要实现百度这种,用前缀树就好了。
    jingniao
        8
    jingniao  
       2018-05-26 11:17:28 +08:00 via Android
    数量级小(10w 以下)的话,前缀树放到内存中,查询速度杠杠的……
    再多就不行了,考虑 ngram 数据库索引或者 es 吧
    WilliamLin
        9
    WilliamLin  
       2018-05-26 17:42:41 +08:00 via Android
    数据量少,用数据库正则匹配,量大,那就上 lucene 这类的了
    jaylong
        10
    jaylong  
       2018-05-26 22:14:51 +08:00
    DigitalOcean 的 support 搜索下拉超级赞
    beggarvip
        11
    beggarvip  
       2018-05-27 10:35:43 +08:00 via Android
    @swulling 那还有学的必要吗?根本没应用场景啊
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2718 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 11:55 · PVG 19:55 · LAX 03:55 · JFK 06:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.