参考资料: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; }