haystack 是 django 全文搜索的一个中间件,可以粘合 django 应用和 solr、xapian、whoosh 全文搜索引擎。
solr和xapian是早就知道的,Whoosh就没听过了。简单的了解后感觉这东西还是非常不错的。whoosh是一个纯python实现的全文搜索引擎。对python应用而言,whoosh的纯python实现,使whoosh的集成会容易很多,而且扩展起来也会容易很多。
下面是对Whoosh官方简介的翻译
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.
请问haystack+whoosh对中文的支持怎么样?
我试验了一下,对于因为这样一个一个词用空格(符号)隔开的,他是可以检索的。但是对于像中文这样一个词一个词是直接连接在一起的(比如:“心理学与生活”),那么检索“心理学”或者“生活”就无法检索到结果。请问这个东西有办法解决吗?
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]
hi 博主 你好:
小弟现在也在弄whoosh,现在遇到的困难是没办法中文分词 而且whoosh给的例子查找一个中文 比如“哈” 就会出错 ,借用你的例子 提示根本没有 find 方法 总之还请仁兄帮帮忙 我的例子在这 http://omploader.org/vNHRyMg/example.rar
由于我不知道你能否给我回复 还请发邮件通知我
谢谢
我给出的则个正则表达式是按照字分词,
比如”你们好”会分成
你/们/好
文章中只要包含了 你/们/好 这三个字都会搜索出来(比如:“你的们都好啊”会被认为匹配)。
为了避免这个情况,你可以给要搜索的文字加个双引号。
比如 u'”你们好”‘
@vicalloy 我转发和分享给其他同学了。
这样的建立中文索引的话,分割成一个个的字,没有分词功能,搜索出来的结果大打折扣了
这样分词主要是出于使用方便的考虑,通常情况下效果还可以。如果希望得到比较高的分词质量还是得用专门的分词组件。
其实可以用whoosh的自带的N-grams
http://packages.python.org/Whoosh/ngrams.html