推荐学习书目
› 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 · 5270 views
    This topic created in 2252 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
    JasperYanky
    Sep 4, 2020
    1
    上 es
    wzw
    wzw
    Sep 4, 2020 via iPhone
    2
    我是自己写,全部放内存,用 fastapi
    lixuda
    lixuda
    OP
    Sep 4, 2020
    3
    @wzw 能参考下吗?
    小白用户,放内存怎么写?
    wzw
    wzw
    Sep 4, 2020
    4
    @lixuda #3 你看看 expiringdict 我这个方法也有不好的地方, 好的地方是 快!
    sylvos
    sylvos
    Sep 4, 2020 via iPhone
    5
    expiringdict 怎么用,有多快
    lixuda
    lixuda
    OP
    Sep 4, 2020
    6
    @wzw https://github.com/mailgun/expiringdict 这个?字典缓存?能否再详细点,非常感谢
    zhuangzhuang1988
    zhuangzhuang1988
    Sep 4, 2020
    7
    pypy??
    whoosh 反正是纯 python 的.
    lixuda
    lixuda
    OP
    Sep 4, 2020
    8
    @zhuangzhuang1988 主要是想确认,是我使用的不对,还是本来就是这么慢。
    nooper
    nooper
    Sep 4, 2020
    9
    2016 那都不维护了,你用它干啥。
    lixuda
    lixuda
    OP
    Sep 5, 2020
    10
    @nooper 图它简单方便
    nonduality
    nonduality
    Sep 5, 2020
    11
    或许你可以看下 whoosh 的索引数据结构,然后把它改为使用 diskcache 或 redis 做缓存后端。
    nonduality
    nonduality
    Sep 5, 2020
    12
    如果你在 Django 下使用 Whoosh,可以试下 Haystack (改起来应该很快),看是不是也这么慢,是否存在不恰当使用的地方。

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

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