纯python的全文搜索组件Whoosh

haystack 是 django 全文搜索的一个中间件,可以粘合 django 应用和 solr、xapian、whoosh 全文搜索引擎。

solr和xapian是早就知道的,Whoosh就没听过了。简单的了解后感觉这东西还是非常不错的。whoosh是一个纯python实现的全文搜索引擎。对python应用而言,whoosh的纯python实现,使whoosh的集成会容易很多,而且扩展起来也会容易很多。

下面是对Whoosh官方简介的翻译

原文地址http://whoosh.ca/wiki

Whoosh: 高效的纯python全文搜索组件

Whoosh是一个纯python实现的全文搜索组件。Whoosh不但功能完善,还非常的快。

Whoosh的作者是MattChaput,由Side Effects Software公司开发。项目的最初用于Houdini(Side Effects Software公司开发的3D动画软件)的在线帮助系统。Side Effects Software公司将该项目开源。

主要特性

  • 敏捷的API(Pythonic API)。
  • 纯python实现,无二进制包。程序不会莫名其妙的崩溃。
  • 按字段进行索引。
  • 索引和搜索都非常的快 — 是目前最快的纯python全文搜索引擎。
  • 良好的构架,评分模块/分词模块/存储模块等各个模块都是可插拔的。
  • 功能强大的查询语言(通过pyparsing实现功能)。
  • 纯python实现的拼写检查(目前唯一的纯python拼写检查实现)

为啥选择Whoosh

  • 纯python实现,省了编译二进制包的繁琐过程。
  • python代码比java更容易读懂,而且用起来也更方便。(翻者注:这个容易引发口水)
  • 在很多时候易用性比单纯的最求速度更重要。

Whoosh从其他的开源搜索引擎中获取了大量的灵感。 基础构架参考Lucene,使用KinoSearch的索引算法,部分评分算法来自Terrier,英文的词语态变化来自Minion.

8 Comments

  • jttqzbc
    2010年05月16号 - 1:17 下午 | Permalink

    请问haystack+whoosh对中文的支持怎么样?

    我试验了一下,对于因为这样一个一个词用空格(符号)隔开的,他是可以检索的。但是对于像中文这样一个词一个词是直接连接在一起的(比如:“心理学与生活”),那么检索“心理学”或者“生活”就无法检索到结果。请问这个东西有办法解决吗?

  • 2010年05月17号 - 8:21 下午 | Permalink

    Whoosh的分词是基于正则表达式的,所以只需要写出合适的正则表达式就可以正确分词。
    下面是一些例子,可能有不完善的地方,需要继续完善完善。
    #测试分词
    #!/usr/bin/env python
    # -*- coding: UTF-8 -*-
    from whoosh.analysis import RegexAnalyzer
    rex = RegexAnalyzer(ur”([\u4e00-\u9fa5])|(\w+(\.?\w+)*)”)
    print [token.text for token in rex(u”hi 中 000 中文测试中文 there 3.141 big-time under_score”)]

    #一个完整的演示
    #!/usr/bin/env python
    # -*- coding: UTF-8 -*-
    from whoosh.index import create_in
    from whoosh.fields import *
    from whoosh.analysis import RegexAnalyzer
    analyzer = RegexAnalyzer(ur”([\u4e00-\u9fa5])|(\w+(\.?\w+)*)”)
    schema = Schema(title=TEXT(stored=True), path=ID(stored=True), content=TEXT(stored=True, analyzer=analyzer))
    ix = create_in(“indexdir”, schema)
    writer = ix.writer()
    writer.add_document(title=u”First document”, path=u”/a”,
    content=u”This is the first document we’ve added!”)
    writer.add_document(title=u”Second document”, path=u”/b”,
    content=u”The second one 你 中文测试中文 is even more interesting!”)
    writer.commit()
    searcher = ix.searcher()
    results = searcher.find(“content”, u”first”)
    print results[0]
    results = searcher.find(“content”, u”你”)
    print results[0]
    results = searcher.find(“content”, u”测试”)
    print results[0]

  • zjm1126
    2010年07月4号 - 3:15 上午 | Permalink

    hi 博主 你好:

    小弟现在也在弄whoosh,现在遇到的困难是没办法中文分词 而且whoosh给的例子查找一个中文 比如“哈” 就会出错 ,借用你的例子 提示根本没有 find 方法 总之还请仁兄帮帮忙 我的例子在这 http://omploader.org/vNHRyMg/example.rar

    由于我不知道你能否给我回复 还请发邮件通知我
    谢谢

  • 2010年07月5号 - 9:53 上午 | Permalink

    我给出的则个正则表达式是按照字分词,
    比如”你们好”会分成
    你/们/好
    文章中只要包含了 你/们/好 这三个字都会搜索出来(比如:“你的们都好啊”会被认为匹配)。
    为了避免这个情况,你可以给要搜索的文字加个双引号。
    比如 u'”你们好”‘

  • 2011年06月15号 - 5:30 下午 | Permalink

    @vicalloy 我转发和分享给其他同学了。

  • 2012年10月11号 - 3:50 下午 | Permalink

    这样的建立中文索引的话,分割成一个个的字,没有分词功能,搜索出来的结果大打折扣了

  • 2012年10月12号 - 8:59 上午 | Permalink

    这样分词主要是出于使用方便的考虑,通常情况下效果还可以。如果希望得到比较高的分词质量还是得用专门的分词组件。

  • 2012年10月17号 - 10:40 上午 | Permalink

    其实可以用whoosh的自带的N-grams
    http://packages.python.org/Whoosh/ngrams.html

  • Comments are closed.