最近由于项目需要,原先用MySQL实现的全文检索功能已不能满足需求,于是乎想到了利用开源的全文检索项目,经人介绍看看了Lucene,Lucene使用Java实现的,目前是Apache Jakarta的项目之一,已经有一套完整和成熟的库,可惜本人对Java懂之甚少,便找了个C++ porting的版本,看了看里面的demo,动手体验了一下,感觉用“短小、强悍”形容再恰当不过了,十几行代码便能完成建立索引和进行搜索:
建立索引:
IndexWriter* writer = NULL;
lucene::analysis::standard::StandardAnalyzer an;
// 其中target是要建立的索引名
char* target = "index_name";
writer = new IndexWriter( target ,&an, true);
Document* doc = new Document();
doc->add( *Field::Text(_T("author"), _T("abc")) );
writer->addDocument( doc );
writer->optimize();
writer->close();
搜索:
char* index = "index_name";
char* searchfor= "abc";
IndexSearcher s(index);
standard::StandardAnalyzer analyzer;
// searchfor 为需要搜索的字符串
Query* q = QueryParser::parse(searchfor, _T("author"), &analyzer);
// 返回匹配的结果集
Hits* h = s.search(q);
// 遍历结果集
for ( int32_t i=0;i<h->length();i++ ){
// 毎一条结果都是一个Document对象,引用也很方便
Document* doc = &h->doc(i);
// 结果是根据匹配度排序的:
h->score(i);
}
当然,更多的代码能实现更多的功能,如Filter, Sort等都是Lucene中的功能,对于一般的中小型应用来说,已经足够了。另外建立索引和搜索的速度,目前还没有大规模的测试,从已用过的反馈来看都还是不错的。
CLucene目前的版本还不支持中日韩等Unicode字符集,关于Lucene如何支持Unicode字符集,正在研究中,后面会与大家分享。
下面是关于Lucene的一些资源
Lucene项目主页:
http://jakarta.apache.org/lucene/
Lucene教程:
http://www.darksleep.com/puff/lucene/lucene.html
Lucene的.NET实现:dotLucene
http://sourceforge.net/projects/dotlucene/
Lucene作者Cutting的几篇论文和专利
http://lucene.sourceforge.net/publications.html
CLucene API 文档: