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