Xapian实战(三):索引

参考资料:

Xapian:Document, Value和Term

Xapian:Database

Xapian机制简要介绍

1. Xapian中各类要点总结

@ Database

Database API参考

WritableDatabase API参考

Xapian的Database是所有用于检索的信息表的集合,根据xapian的不同有以下几种创建Database时可选择的后端类型:

brass - 当前开发中的后端,并将作为1.4.x版本以后的默认后端;

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

 

posted on 2016-08-19 20:04  tanfy  阅读(820)  评论(0编辑  收藏  举报

导航