Xapian的database是所有用于检索的信息表的集合,以下的表是必需的:
  1. posting list table 保存了被每一个term索引的document,实际上保存的应该是document在database中的Id,此Id是唯一的。这个就是倒排表。
  2. record table 保存了每一个document所关联的data,data不能通过query检索,只能通过document来获取。这个相当于快照。
  3. term list table 保存了索引每个document的所有的term。这个相当于正排表。
  4.  position list table 保存了每一个Term出现在每一个document中的位置。就是term位置表。

  其他可选的表还包括,value table 保存了每一个document的values,values是用作保存、排序或其它作用的。 + spelling table 保存了拼写纠正的数据。 + synonym table 保存术语的字典,例如NBA、C#或C++等。

  目前最新版本的xapian,一个表一般会包含三个数据,如termlist表会被存储为以下三个文件“termlist.baseA”、“termlist.baseB”、“termlist.dB”。在这些文件中,其实只有”.db”文件存储了真实的数据,“.baseA”和“baseB”文件是用作跟踪如果于“.dB”文件中查找数据。

图 1 一个实际的xapian文件列表示意图

  term可以用作有效地查找它的posting list,在posting list里,每一个document带有一个很短的标识符,就是document id。简单来说,一个posting list可以被认为是一个由document ids组成的集合。而term list则是一个字符串组成的集合。在某些IR系统的内部是使用数字来表示term的,因此在这些系统中,term list则是数字组成的集合,而Xapian则不是这样,它使用原汁原味的term,而使用前缀来压缩存储空间。
 
一个例子:
    Xapian::Document doc;
doc.add_term("K你好");
doc.add_term("K那里");
//posting是带position的term
doc.add_posting("K吃饭", 14);
doc.add_posting("K玩耍", 8);
/*
这里最好先用一个map<string, int>放置value的名称和索引的配对
这里使用起来像Lucene的SortField一样了。
*/
doc.add_value(1, "1");
doc.set_data("你好啊,在那里玩耍呢?还没吃饭吗?");
//创建一个可写的db
Xapian::WritableDatabase db("c:\\db");
//将document加入到db中,返回document的id,此id在db中是唯一的
Xapian::docid id = db.add_document(doc);
//刷新到硬盘中
db.flush();

获取document信息的例子:

//获取
Xapian::Document doc = db.get_document(id);
string v = doc.get_value(1);
printf(v);//输出
string data = doc.get_data();
printf(data);//输出"你好啊,在那里玩耍呢?还没吃饭吗?"
for (Xapian::TermIterator iter = doc.termlist_begin(); iter != doc.termlist_end(); ++iter)
{
printf(*iter);//依次输出term和posting
} 读取倒排列表(posting table的例子)
相关的类主要有两个,一个是PositionIterator,一个是PostingSource
其中
PositionIterator用来遍历一个term的所有docid列表
PostingSource则用来提供postings的扩展数据资源。

string t_name = "K你好";
cout<<"is exist "<<db.term_exists(t_name) <<endl;
PostingIterator term_begin = db.postlist_begin(t_name);
PostingIterator term_end = db.postlist_end(t_name);

for (PostingIterator iter=term_begin; iter != term_end ; iter++)
{
cout<<"doc id "<<*iter<<endl; //读取docid
cout<<"term freq "<<iter.get_wdf()<<endl; //读取文档内词频,tf
}

xapian搜索系统存储结构解读的更多相关文章

  1. Atitit.数据索引 的种类以及原理实现机制 索引常用的存储结构

    Atitit.数据索引 的种类以及原理实现机制 索引常用的存储结构 1. 索引的分类1 1.1. 按照存储结构划分btree,hash,bitmap,fulltext1 1.2. 索引的类型  按查找 ...

  2. IplImage 结构解读

    IplImage 结构解读: typedef struct _IplImage { int nSize;                              /* IplImage大小,等于wi ...

  3. Oracle_高级功能(4) 数据库存储结构

    数据库存储结构分为:物理存储结构和逻辑存储结构.物理结构和逻辑结构分开,对物理数据的存储不会影响对逻辑结构的访问.1.物理存储结构 数据库文件 os block2.逻辑存储结构 tablespace ...

  4. ElasticSearch 2 (13) - 深入搜索系列之结构化搜索

    ElasticSearch 2 (13) - 深入搜索系列之结构化搜索 摘要 结构化查询指的是查询那些具有内在结构的数据,比如日期.时间.数字都是结构化的.它们都有精确的格式,我们可以对这些数据进行逻 ...

  5. Atitit.数据索引 的种类以及原理实现机制 索引常用的存储结构

    Atitit.数据索引 的种类以及原理实现机制 索引常用的存储结构 1. 索引的分类1 1.1. 索引的类型  按查找方式分,两种,分块索引 vs编号索引1 1.2. 按索引与数据的查找顺序可分为 正 ...

  6. 使用elasticsearch搭建自己的搜索系统

    什么是elasticsearch Elasticsearch 是一个开源的高度可扩展的全文搜索和分析引擎,拥有查询近实时的超强性能. 大名鼎鼎的Lucene 搜索引擎被广泛用于搜索领域,但是操作复杂繁 ...

  7. 搜索系统核心技术概述【1.5w字长文】

    前排提示:本文为综述性文章,梳理搜索相关技术,如寻求前沿应用可简读或略过 搜索引擎介绍 搜索引擎(Search Engine),狭义来讲是基于软件技术开发的互联网数据查询系统,用户通过搜索引擎查询所需 ...

  8. innodb的存储结构

    如下所示,innodb的存储结构包含:表空间,段,区,页(块),行 innodb存储结构优化的标准是:一个页里面存放的行数越多,其性能越高 表空间:零散页+段 独立表空间存放的是:数据.索引.插入缓冲 ...

  9. 人人都是 DBA(VIII)SQL Server 页存储结构

    当在 SQL Server 数据库中创建一张表时,会在多张系统基础表中插入所创建表的信息,用于管理该表.通过目录视图 sys.tables, sys.columns, sys.indexes 可以查看 ...

随机推荐

  1. Java:Date、Calendar、Timestamp的使用

    一.Java.util.Date 该对象包含了年月日时分秒信息.具体使用如下代码: //String 转换为Date private static void dateDemo() throws Par ...

  2. IE str.trim() 不兼容问题解决方法

    本文实例分析了javascript在IE下trim函数无法使用的解决方法: 首先,javascript的trim函数在firefox或者chrome下面使用没有问题: 1 2 3 4 5 <sc ...

  3. 关于vs2008使用oracleclient链接oracle数据库报报错OCIEnvCreate 失败,返回代码为 -1,但错误消息文本不可用

    用vs2008链接oracle数据库出现问题,报错OCIEnvCreate 失败,返回代码为 -1,但错误消息文本不可用,从网上找了好久方法,有两种oracle客户端文件权限,和运行vs2008以管理 ...

  4. windows下安装wamp和wordpress

    安装wamp WAMP是一个windows上的php开发集成环境,一键安装php,apache和mysql,非常方便. 双击wampserver2.2exxxxxxxxxx.exe文件进行安装,安装过 ...

  5. javascript 获取 class 样式 重新赋值class样式 为div等系列标签内更改内容

    name = document.getElementById(project_not_through_id).className;                     // 获取目标id的 cla ...

  6. cx_Oracle使用方法一

    cx_Oracle使用方法 正确安装好cx_oracle之后,要使用它来连接到oracle数据库进行操作,具体应该分3步走: 第一步:导入cx_Oracle ,建立连接 >>> im ...

  7. MyEclipse10

    1.配置tomcat Windows->Preferences->My Eclipse->Servers->Tomcat,对于64位操作系统而言,Tomcat home dir ...

  8. java的Arrays类的应用

    (2012-08-01 14:48:27) 转载▼ 标签: java arrays类 填充 排序 查找 比较数组 分类: java基础 java.util.Arrays类能方便地操作数组,它提供的所有 ...

  9. IPv6被拒如何破?-b

    APP在美国的IPv6-Only网络环境下测试不通过. 网上各种方法都试了,什么NSURLConnection, Reachability,试完还是拼人品,快要跪了 小伙伴们开始质疑这种测试方法了. ...

  10. Struts2技术内幕-----第七章

    1)基于人机交互的请求--响应模式主要由哪三大要素构成?     ①沟通协议-----人和机器都能够明白的数据通信格式     ②请求内容-----人通过某种机制向机器发起的数据请求     ③响应内 ...