Xapian實戰(三):索引

參考資料:html

Xapian:Document, Value和Term數據庫

Xapian:Database後端

Xapian機制簡要介紹api

1. Xapian中各種要點總結併發

@ Databaseide

Database API參考函數

WritableDatabase API參考ui

Xapian的Database是全部用於檢索的信息表的集合,根據xapian的不一樣有如下幾種建立Database時可選擇的後端類型:this

brass - 當前開發中的後端,並將做爲1.4.x版本之後的默認後端;spa

chert -

1.2.x版本的默認後端,支持增量修改、單寫+多讀併發的模式;

能夠利用Chert Namespace中的open函數分別生成DataBase(僅讀取功能)和WritableDatabase(支持讀寫)類型的數據庫;

Chert API參考

flint - 1.0.x的默認後端,與chert相似;

inmemory -

全內存的database,可用於創建臨時的小數據庫;

能夠利用InMemory Namespace中的open函數建立WritableDatabase(支持讀寫)類型的數據庫;

InMemory API參考

@ Document

Document API參考

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();
View Code

@ 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;
}
View Code
相關文章
相關標籤/搜索