Xapian 学习笔记 2 相关概念
来源:互联网 发布:数据共享与交换平台 编辑:程序博客网 时间:2024/05/16 08:26
Xapian 学习笔记 2 一些概念
---------------------------
Xapian有多种后台的数据库存储模型,默认的是为Chert,它使用了一种叫copy-on-write的B+树来做其数据结构,很多现有的Xapian数据库都支持事务,你可以把一批命令放在一个事务中运行,但是,当然的数据库只支持单个数据库写对象存在,也就是说在创建一个DataBaseWritable对象的时候,会对数据库进行加锁,如果另一个写数据库对象再去写这个数据库时,会出现DatabaseLockError错误,但是多个读对象是同时存在于同一个数据库。
当打开一个数据库准备进行读操作时,会创建一个找开数据库的镜像,这样有写操作时,读对象是不可见的,除非读对象运行reopen()操作。这样读/写操作就隔离了。现在的Xapian多版本同步还是有一些限制的,特别是当数据库有两个版本同时存在时,也就是说有多个读,一个写数据库操作时,当写数据库只修改了数据库,运行了一次commit时,是没问题的,但是当写数据库又运行了第二次commit时,读数据库操作会收到了一个Xapian::DatabaseModifiedError,在这种情况下,读数据库操作要更新其数据库的镜像版本,使用reopen()操作,这个要在编程上注意一下。
Xapian还有一个remote后端数据库,数据库服务端与客户端通过自定义的网络协议来通讯。Xapian还有一个特点是可以同时对多个数据库进行查询,并且对结果进行合并,这个特点可以结合remote DB来使用,这样可以横向扩展数据的容量,一个查询条件可以同时被多台后台查询服务运行,达到查询集群的目的。
Xapian同时支持数据库的复制,而且只复制那些变更过的索引数据,这样可以使用数据冗余,达到负载均衡的目的。
其中data代表一个文档的关系数据区,Xapian只负责对每个文档的data进行存储,不做分析处理,可能存储的时候会用zlib进行压缩,这个data可以是文档的部分或者全部数据。最常用的data区存储的数据是一些查询时要返回的数据,如文档的路径,日期等文档的元数据可以存储在这个地方,当然你可以使用一定的数据结构,如XML,JSON,protobuf等结果。
其中的terms就是文档分析出来的词的单元,它是最基本的查询单位,查询的过程简单来说就是把用户的查询进行分词,再把分词后的结果与索引的文档分词进行比较,返回包括这些词的文档。当然,Xapian对于分词的索引不仅仅是存储一个文档所对应的term,还有它的位置信息,词的文档频率,总的频率,这些信息被文档打分器提供文档分数的计算依据,
最后是values,首先values也是terms,只是它是一种更加灵活的terms,每一个被索引的文档都有一系列的values,每一个value的组成是一个二元组<K,V>,其中K是value的solt,相当于一个id号,它的范围是unsigned int32,而Value是一个值,一般是一个String,也可以是Float,Double,但是都要通过其接口转换成String类型才能存储,这个方法是sortable_serialise,它可以对非String的value进行系列化,在查询的时候对其进行反序列化。这些values的作用是在查询的时候提供更加灵活的筛选条件,如我想把查询的结果文档按特定的字段排序,如价格,如果价格范围,这些值都会影响到文档的排序分数。values的另一个作用是可以对文档结果进行特定字段的聚类。
当然在分词的时候你可以加入一些词的过滤,词的特定域的处理,因为在Xapian中没有像Lucene一样有Field的概念,Xapian一般的解决方法是通过在每一个词前面加一个前缀来解决这个问题,不同的前缀表达这个词隶属于不同的Field. 需要注意的是,在Xapian中,如果你在索引的时候使用了TermGenerate来进行分词,那在查询的时候一定要使用QueryParser来对查询条件进行解析。
---------------------------
1. 同步概念
Xapian没有显示的支持多线程,为了避免不必要的线程死锁,Xapian没有使用任何全局变量,所以你可以你的多线程应用中放心的使用Xapain对象,但是一些Xapian对象内部是有关联的,如Xapian::Database::get_document(),返回的对象Xapian::Document对象内部保存了一个指向DataBase的一个引用,所以它不适合在多线程中使用,所以在多线程中使用Xapian的时候还是要注意一些东西的。2. 索引概念
- 数据库 - Database
Xapian有多种后台的数据库存储模型,默认的是为Chert,它使用了一种叫copy-on-write的B+树来做其数据结构,很多现有的Xapian数据库都支持事务,你可以把一批命令放在一个事务中运行,但是,当然的数据库只支持单个数据库写对象存在,也就是说在创建一个DataBaseWritable对象的时候,会对数据库进行加锁,如果另一个写数据库对象再去写这个数据库时,会出现DatabaseLockError错误,但是多个读对象是同时存在于同一个数据库。
当打开一个数据库准备进行读操作时,会创建一个找开数据库的镜像,这样有写操作时,读对象是不可见的,除非读对象运行reopen()操作。这样读/写操作就隔离了。现在的Xapian多版本同步还是有一些限制的,特别是当数据库有两个版本同时存在时,也就是说有多个读,一个写数据库操作时,当写数据库只修改了数据库,运行了一次commit时,是没问题的,但是当写数据库又运行了第二次commit时,读数据库操作会收到了一个Xapian::DatabaseModifiedError,在这种情况下,读数据库操作要更新其数据库的镜像版本,使用reopen()操作,这个要在编程上注意一下。
Xapian还有一个remote后端数据库,数据库服务端与客户端通过自定义的网络协议来通讯。Xapian还有一个特点是可以同时对多个数据库进行查询,并且对结果进行合并,这个特点可以结合remote DB来使用,这样可以横向扩展数据的容量,一个查询条件可以同时被多台后台查询服务运行,达到查询集群的目的。
Xapian同时支持数据库的复制,而且只复制那些变更过的索引数据,这样可以使用数据冗余,达到负载均衡的目的。
- 文档与文档数据
其中data代表一个文档的关系数据区,Xapian只负责对每个文档的data进行存储,不做分析处理,可能存储的时候会用zlib进行压缩,这个data可以是文档的部分或者全部数据。最常用的data区存储的数据是一些查询时要返回的数据,如文档的路径,日期等文档的元数据可以存储在这个地方,当然你可以使用一定的数据结构,如XML,JSON,protobuf等结果。
其中的terms就是文档分析出来的词的单元,它是最基本的查询单位,查询的过程简单来说就是把用户的查询进行分词,再把分词后的结果与索引的文档分词进行比较,返回包括这些词的文档。当然,Xapian对于分词的索引不仅仅是存储一个文档所对应的term,还有它的位置信息,词的文档频率,总的频率,这些信息被文档打分器提供文档分数的计算依据,
最后是values,首先values也是terms,只是它是一种更加灵活的terms,每一个被索引的文档都有一系列的values,每一个value的组成是一个二元组<K,V>,其中K是value的solt,相当于一个id号,它的范围是unsigned int32,而Value是一个值,一般是一个String,也可以是Float,Double,但是都要通过其接口转换成String类型才能存储,这个方法是sortable_serialise,它可以对非String的value进行系列化,在查询的时候对其进行反序列化。这些values的作用是在查询的时候提供更加灵活的筛选条件,如我想把查询的结果文档按特定的字段排序,如价格,如果价格范围,这些值都会影响到文档的排序分数。values的另一个作用是可以对文档结果进行特定字段的聚类。
- 分词器
当然在分词的时候你可以加入一些词的过滤,词的特定域的处理,因为在Xapian中没有像Lucene一样有Field的概念,Xapian一般的解决方法是通过在每一个词前面加一个前缀来解决这个问题,不同的前缀表达这个词隶属于不同的Field. 需要注意的是,在Xapian中,如果你在索引的时候使用了TermGenerate来进行分词,那在查询的时候一定要使用QueryParser来对查询条件进行解析。
- 索引限制
- Term Length:一个词限制在256个字节内,
- Document Data:一个data区不能大于100MB,默认是8KB
- Document value:和一个data区的限制是一样的,但一般建议value不要太大
- Document ID: 当前范围是32bit,大概在43亿左右,文档删除的ID号不会被重新利用,除非你对数据库进行compact
- B-tree block number: 目前支持最大为32bit个块
- OS file size:所有操作系统对于单个文档的限制对于Xapian都适用,如ext4对于单个文件的大小为16TB,
- Document length:文档长度的存储限制为unsigned 64bit
3. 查询概念
- 查询
- 查询解析
- 匹配器
4. 参考
- http://getting-started-with-xapian.readthedocs.org/en/latest/index.html
- Xapian 学习笔记 2 相关概念
- Xapian学习笔记
- Xapian 学习笔记 3 相关字段的排序
- Xapian学习笔记 1 介绍
- CSS学习笔记(概念相关)
- Xapian 学习笔记 4 分面搜索
- 学习xapian
- 学习Xapian(2) – 拼写校正
- jsp 学习笔记-servlet相关概念
- vue.js学习笔记(相关概念)
- SpringMVC学习笔记--相关概念介绍
- 网络编程相关概念学习笔记
- 凸优化相关概念学习笔记
- 模式识别学习笔记一、相关概念
- UML学习笔记---了解UML,UML相关知识,相关概念
- xapian 安装笔记
- 矩阵相关概念笔记
- 人工智能相关概念笔记
- JDBC 基础
- Objective-C Memory Management For Lazy People
- Android RatingBar自定义替换系统图片
- tomcat 目录结构——详细并不断完善
- 【Java SE】对象的序列化和反序列化2
- Xapian 学习笔记 2 相关概念
- java 字符串,字符数组,list间的转化
- USB Descriptor
- 惹人喜爱虚拟光驱
- Android内存管理策略的优化
- 测试一下看看
- 50个c/c++ 源代码网站
- Spring-云中的Java”——SpringSource 里程碑事件一览
- android照相及照片上传