參考資料:html
Xapian:Document, Value和Term數據庫
Xapian機制簡要介紹api
1. Xapian中各種要點總結併發
@ Databaseide
Xapian的Database是全部用於檢索的信息表的集合,根據xapian的不一樣有如下幾種建立Database時可選擇的後端類型:this
brass - 當前開發中的後端,並將做爲1.4.x版本之後的默認後端;spa
chert -
1.2.x版本的默認後端,支持增量修改、單寫+多讀併發的模式;
能夠利用Chert Namespace中的open函數分別生成DataBase(僅讀取功能)和WritableDatabase(支持讀寫)類型的數據庫;
flint - 1.0.x的默認後端,與chert相似;
inmemory -
全內存的database,可用於創建臨時的小數據庫;
能夠利用InMemory Namespace中的open函數建立WritableDatabase(支持讀寫)類型的數據庫;
@ Document
Xapian中的Document包括三個元素:term, data, value;
term -
若Document D被名爲T的term所描述,那麼T被認爲索引了D;
Term能夠使用TermGenerator生成:給TermGenerator對象設置Document,再將一段用空格分開的字符串傳入TermGenerator對象中,就能夠給Document加上這段文本的索引域了(英文單詞使用空格分割能夠直接使用TermGenerator,中文須要進行分詞操做);
value -
每一個Document中可有多個value,value能夠方便在匹配過程當中快速訪問,它們能夠用做排序、排隊多餘重複的document和範圍檢索等用途;
data -
每一個Document中只有一個,能夠爲任意類型格式的數據,爲最後搜索時向用戶顯示的內容;
2. 實戰
@ Database / WritableDatabase
// 建立Chert類型的可讀寫數據庫 Xapian::WritableDatabase writabledb = Xapian::Chert::open(dbname, Xapian::DB_CREATE_OR_OVERWRITE); // 向數據庫中加入Document Xapian::Document mydoc; ... writabledb.add_document(mydoc); // 更改數據庫後須要進行確認操做 writabledb.commit();
@ Document
Xapian::Document mydoc; // 設置data std::string data = "this is the description of a page"; mydoc.set_data(data); // 設置value std::vector<std::string> value = {test1, test2}; std::vector<std::string>::iterator itv = value.begin(); int count = 1; // value的槽號 for (; itv != value.end(); ++itv) { mydoc.add_value(count, *itv); ++ count; } // 設置term std::string newcontent; // 已經分詞完畢帶有空格的文檔 Xapian::TermGenerator indexer; indexer.set_document(mydoc); indexer.index_text(newcontent); // 顯示data std::cout << mydoc.get_data() << std::endl; // 顯示value Xapian::ValueIterator itvalue = mydoc.values_begin(); for (; itvalue != mydoc.values_end(); ++itvalue) { std::cout << *itvalue << std::endl; } // 顯示term Xapian::TermIterator iterm = mydoc.termlist_begin(); for (; iterm != mydoc.termlist_end(); ++iterm) { std::cout << *iterm << std::endl; }