Xapian实战(三):索引
参考资料:
1. Xapian中各类要点总结
@ Database
Xapian的Database是所有用于检索的信息表的集合,根据xapian的不同有以下几种创建Database时可选择的后端类型:
brass - 当前开发中的后端,并将作为1.4.x版本以后的默认后端;
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; }