推荐学习书目
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
lixuda
V2EX  ›  Python

Python whoosh 如何优化加速

  •  
  •   lixuda · Sep 4, 2020 · 4725 views
  •   You need to sign in to view this topic
    This topic created in 2127 days ago, the information mentioned may be changed or developed.

    第一次使用 whoosh 数据量 300 万条,索引后 1.5G 文件

    根据文档查询,时间经常需要 7 秒以上,问问大神如何加速优化下?感谢

        ix = open_dir("indexdir")
        with ix.searcher() as searcher:
            myquery = Term("subject", "关键词")
            results = searcher.search(myquery,limit=10)
            for result1 in results:
                print(dict(result1))
            
    
    22 replies    2020-09-10 16:00:17 +08:00
    JasperYanky
        1
    JasperYanky  
       Sep 4, 2020
    上 es
    wzw
        2
    wzw  
       Sep 4, 2020 via iPhone
    我是自己写,全部放内存,用 fastapi
    lixuda
        3
    lixuda  
    OP
       Sep 4, 2020
    @wzw 能参考下吗?
    小白用户,放内存怎么写?
    wzw
        4
    wzw  
       Sep 4, 2020
    @lixuda #3 你看看 expiringdict 我这个方法也有不好的地方, 好的地方是 快!
    sylvos
        5
    sylvos  
       Sep 4, 2020 via iPhone
    expiringdict 怎么用,有多快
    lixuda
        6
    lixuda  
    OP
       Sep 4, 2020
    @wzw https://github.com/mailgun/expiringdict 这个?字典缓存?能否再详细点,非常感谢
    zhuangzhuang1988
        7
    zhuangzhuang1988  
       Sep 4, 2020
    pypy??
    whoosh 反正是纯 python 的.
    lixuda
        8
    lixuda  
    OP
       Sep 4, 2020
    @zhuangzhuang1988 主要是想确认,是我使用的不对,还是本来就是这么慢。
    nooper
        9
    nooper  
       Sep 4, 2020
    2016 那都不维护了,你用它干啥。
    lixuda
        10
    lixuda  
    OP
       Sep 5, 2020
    @nooper 图它简单方便
    nonduality
        11
    nonduality  
       Sep 5, 2020
    或许你可以看下 whoosh 的索引数据结构,然后把它改为使用 diskcache 或 redis 做缓存后端。
    nonduality
        12
    nonduality  
       Sep 5, 2020
    如果你在 Django 下使用 Whoosh,可以试下 Haystack (改起来应该很快),看是不是也这么慢,是否存在不恰当使用的地方。

    如果还是很慢,但又不喜欢 ES 太重,可以考虑用 Xapian 做引擎,不过它对中文分词的支持会有点麻烦,知道怎么搞的话麻烦告诉下我。
    lixuda
        13
    lixuda  
    OP
       Sep 5, 2020
    @nonduality 现在用 flask+whoosh,目前测试下来,20 万条在 1-3 秒,200 万,就 7 秒以上
    nonduality
        14
    nonduality  
       Sep 5, 2020
    @lixuda Whoosh 有个支持 GAE blobstore 的索引后端,原则上在它基础上改出一个支持 Diskcache 后端的的不太难( Diskcache 很不错,用磁盘做缓存,速度跟 redis 相当)
    nonduality
        15
    nonduality  
       Sep 5, 2020
    @lixuda 经过搜索,发现有篇文章「用 xapian 跟 mmseg 实现中文搜索」的方案很好

    Xapian 比 Whoosh 快 4 倍到 60 倍,上亿条数据几秒内就能搞定,建议你试试
    yucongo
        16
    yucongo  
       Sep 6, 2020 via Android
    elasticsearch 吧,秒搜,也就 1G 硬盘需求
    nonduality
        17
    nonduality  
       Sep 7, 2020
    我已经改好出来一个基于 xapian 的搜索引擎,速度确实快很多。
    lixuda
        18
    lixuda  
    OP
       Sep 7, 2020
    @nonduality 能否分享下?
    nonduality
        19
    nonduality  
       Sep 7, 2020
    @lixuda 我的是配合 django haystack 的 xapian 后端。你可以根据「用 xapian 跟 mmseg 实现中文搜索」这篇文章改,我用的是 jieba 分词,用起来还比较方便。
    mcds
        20
    mcds  
       Sep 7, 2020
    时间应该都花在 open_dir 上了吧?把它做成 web 服务常驻内存就好,我现在索引文件大概在 700m 左右,查询时间 0.1s 左右
    nonduality
        21
    nonduality  
       Sep 10, 2020
    经过初步测试,改用 Xapian 做后端,比用 Whoosh 做后端快 30 到 60 倍。从中也可以看到,尽管 Haystack 框架看起来很重,但其实不是性能瓶颈。
    lixuda
        22
    lixuda  
    OP
       Sep 10, 2020
    @nonduality 关键是 Xapian 性能比 whoosh 好,whoosh 毕竟是纯 py
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5623 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 60ms · UTC 06:31 · PVG 14:31 · LAX 23:31 · JFK 02:31
    ♥ Do have faith in what you're doing.