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
相关文章
相关标签/搜索