天天看点

实际程序调用IndexWriter* writer = NULL

最近由于项目需要,原先用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的一些资源

继续阅读