Xapian实战(二):core concepts
参考资料
正文
1. 并发性
xapian不包含任何全局变量,所以多线程编程中,在没有共享资源的情况下可以安全使用xapian。在实际操作中,由于每个线程都可以创建自己的xapian.Database对象,所以这个限制条件完全没有问题。当然如果真的需要在多线程中使用同一个xapian对象,则需要用到mutex的线程锁。
需要注意的是,有些xapian对象包含了其他对象的引用——例如,xapian.Database.get_document()的结果xapian.Document包含xapian.Database的引用,所以在一条线程中使用xapian.Database,另一条线程中使用xapian.Document对象是不安全的。
2. Indexing concepts
2.1 Databases
几乎所有的xapian操作都围绕着一个xapian的数据库。将文件放入数据库的过程叫做建立索引。存储在数据库中的主要信息是每个术语和对应的文档的映射。数据库还可以存储同义词扩展以及拼写纠错的信息。
2.1.1 Backends
xapian数据库使用自定义格式保存数据,这样可以保证搜索时的效率;xapian没有使用关系型数据库。xapian有不止一个后台数据库,xapian1.2版本主要的后台数据库为Chert。该数据库在给定地址的文件系统中存储信息。
xapian允许同时在多个数据库中刚搜索并将结果进行整合的操作。当数据量太大一台机器无法处理时,利用此特性,xapian可以结合远程的数据库来处理并进行搜索。
2.1.2 On-disk databases
如上所述,xapian1.2版本的默认数据库类型为Chert。当打开一个已经存在的数据库时,xapian将自动使用Chert后台去处理。
Chert和Brass都使用写时复制的B+树的数据结构。
2.1.3 Stub database files
xapian中,stub数据库是一个简单的文本文档,该文档中列出了一系列数据库(本地文件系统或者远程数据库)的地址。
2.1.4 In-memory databases(内存中的数据库)
xapian中有内存数据库类型,该数据库可以用于测试或者一些短期的用途。然而它效率底下,而且并不支持Xapian的所有特性(如拼写纠错,同义词等)。因此对于生产系统来说,xapian最好使用在磁盘上的数据库如Chert,该数据库在RAM disk上保存文件(RAM:Random-AccessMemory"随机存取存储器",特点是掉电失忆)。
2.1.5 Remote databases and replication(远程数据库和复制)
xapian的远程数据库后台允许数据库放置在不同的机器上,并通过自定义的协议进入。
对于不同的机器来说,远程数据库同样支持写时复制的操作。
2.1.6 Concurrent access (并发存取)
大多数后台数据库允许在写入一个新的数据库的同时查找已经存在的数据库。目前,所有的后台数据库在同一时间仅能存在一个写操作;在同一个数据库上打开另一个写操作将抛出xapian.DatabaseLockError的错误。
当一个数据库以读的方式打开时,该数据库的固定快照就被确定了。在读该数据库期间,数据库的所有更新对该reader都是不可见的,除非该reader调用xapian.Database.reopen()。如果reader已经读取了数据库的最新版本,那么reopen()将没有任何影响而且对程序没有多少影响。所以当在多线程搜索的时候再次使用相同的xapian.Database对象时,在每次搜索之前调用reopen()是个很合理的策略。
目前,xapian基于磁盘的后端最多只能同时存在两个版本。因此对于数据库,如果写操作仅做了一次修改,那么reader还是可以使用它的快照访问数据库;但是当写操作做了两次修改后,当reader尝试进入数据库已经修改的一部分时,将受到xapian.DatabaseModifiedError的提醒。在这种情形下,该reader可以使用xapian.Database.reopen()获取最新版本的数据库内容。
2.1.7 Locking
在xapian的基于磁盘的后台系统中,当一个数据库以写的方式打开,那么该数据库将处于lock状态以防止其他的writer打开。当原来的writer关闭或者自动释放后,该lock将自行释放。
xapian锁机制一个特殊的地方在于xapian将fork一个子进程来控制该lock,而不是在主进程中控制。This is to avoid the lock being accidentally released due to the slightly unhelpful semantics of fcntl locks.
2.2 Documents
xapian中的Document是由搜索返回的item。当创建一个新的搜索系统时,关键的事情就是要确定系统中的document是什么。在很多情形下可以有不同的选择。例如:搜索一个网站时,对于站点的每一页建立一个document看起来很自然。然而,我们可以选择对于每一页的每一段都建立一个document 或者 将所有的页按主题集中起来,再给每页建立一个document。
在database中,document以一个唯一的32位正整数id进行标识即document ID。
Document有三个组成元素:Data, Terms和Values。
2.2.1 Document Data
document data是document中数据的二进制容器。xapian使得其中的数据完全不可见,而且除了将数据保存在database中,或者当需要时返回以外不再进行其他操作(必要时将压缩)。
它可以用来作为其他数据的参考(比如外来数据库表格的主键),或者可以用来保存document的全文。
一般来说,document data最好存储你将要显示给用户的信息。对于document data中数据的存储格式,xapian没有强制规定:根据你的应用,你可能希望使用换行去分割数据,使用JSON或者xml格式,或者使用其他的方式去封装数据。
2.3 Terms (Document中的Terms)
Terms是Xapian中大多数搜索的基础。简单来说,搜索就是将列表中的terms和document中的terms比较,并返回最配对的一列documents。
一个term通常产生于一篇文档中的每个单词。有很多生成terms的策略。
通常在一篇文档中,同样的单词将出现很多遍。xapian称每个单词出现的次数为within document frequency"文档内频率"并保存在database中。这通常在搜索引擎根据term出现的权重来给出document时会用到。
你可能也需要存储每个term的位置。这些位置通常按照word的数量来存储。
database还保存了terms出现在数据库中的频率的一系列统计数据。term frequency是指某特定的term出现在多少篇document中的个数;collection frequency是指term出现的总次数。
2.3.1 Stemmers
一个常见的标准化形式是stemming。这个程序将各种不同形式的单词转化为单数形式,例如:将birds和bird指向相同的单词-bird。
需要注意的是stemmer的输出不一定必须为一个有效的单词;重要的是相近意思的单词都需要转换为同一种形式,方便去搜索到它们。
stemmer的规则主要根据语言的不同。对于一些语言来说,stemmer是一个可选择的操作。
2.3.2 Fields and term prefixes(未完成)
将document看作由很多fields组成,每个field由terms组成的文档。实际上,一篇结构化的文档中,field可能是标题也可能是其他的元素(比如水果的颜色)。使用标题会方便进行自由文本搜索;使用其他元素可以用来进行文本的过滤工作。
2.4 Term Generator
xapian提供了xapian.TermGenerator类,方便用户将文本处理成terms。这个类可以分析文本,产生合适的terms,并将他们加入document中。
当产生terms的时候,xapian.TermGenerator被设置成perform stemming(和停用词)。它可以用来存储文本中单词的位置信息,还可以为拼写纠错程序保存额外的信息。
如果你希望使用xapian.TermGenerator来处理文档,那么可能在搜索的时候需要用到QueryParser。
2.5 Using identifiers with Xapian
每篇存储在xapian数据库中的文档都有一个唯一的正整数id。
通常这些id都是唯一的,这样就可以方便用户使用这些id重新为存储的文档建立索引 或者 从xapian的索引中删除失效的文档。有以下两种方法可以使用这些id:
第一种方法,当索引id数载40亿以内 而且 你的identifier为32位的正整数时,可以为你的identifiers和xapian的docids建立一对一的映射;
第二种方法是使用一个特别的term用来保存你的identifier,这对于任何类型的identifier均适用。该terms在Chert中的限制长度为245位,所以如果identifier相当长的话,可能需要做其他更复杂的操作。
2.6 Index limitations
当在index中存储数据的时候有以下限制:
Term Length -
term的长度在Chert的后台被限制在了245位,但是term中的0个byte会被编码成2个byte。当你需要将url类的事物存储为ID term的时候需要注意到这个长度的限制。
Document data length -
document data的限制长度和块大小以及其他因素有关。对于默认块大小为8kb的情形,document data的限制长度为100MB以上。
Document value length -
document value的限制长度和data的限制长度相似。但是基于性能的考虑,document value不宜大于几十字节,因为当匹配的时候读取多个100M以上的values的时候,速度会相当慢。
Document ID
document id目前是32位,所以在数据库中存储的文档数量最多为2^32-1篇。当为新文档自动分配id时,被删除的文档id将不会再使用,所以这个限制包括了你删除的文档。你可以通过compacting数据库达到再次使用这些被删除的文档的id的目的。
Xapian实战(二):core concepts的更多相关文章
- kubernetes实战(二十八):Kubernetes一键式资源管理平台Ratel安装及使用
1. Ratel是什么? Ratel是一个Kubernetes资源平台,基于管理Kubernetes的资源开发,可以管理Kubernetes的Deployment.DaemonSet.Stateful ...
- coreseek实战(二):windows下mysql数据源部分配置说明
coreseek实战(二):windows下mysql数据源部分配置说明 关于coreseek在windows使用mysql数据源的配置,以及中文分词的详细说明,请参考官方文档: mysql数据源配置 ...
- Deep Learning in a Nutshell: Core Concepts
Deep Learning in a Nutshell: Core Concepts This post is the first in a series I’ll be writing for Pa ...
- (转) Deep Learning in a Nutshell: Core Concepts
Deep Learning in a Nutshell: Core Concepts Share: Posted on November 3, 2015by Tim Dettmers 7 Comm ...
- 【NFS项目实战二】NFS共享数据的时时同步推送备份
[NFS项目实战二]NFS共享数据的时时同步推送备份 标签(空格分隔): Linux服务搭建-陈思齐 ---本教学笔记是本人学习和工作生涯中的摘记整理而成,此为初稿(尚有诸多不完善之处),为原创作品, ...
- chrome调试工具高级不完整使用指南(实战二)
3.3 给页面添加测试脚本 在现实的工作中,我们往往会遇到一些问题在线上就会触发然后本地就触发不了的问题.或者是,要给某个元素写一个测试脚本.这个时候如果是浏览器有提供一个添加脚本的功能的话,那么我们 ...
- Python爬虫实战二之爬取百度贴吧帖子
大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 前言 亲爱的们,教程比较旧了,百度贴吧页面可能改版,可能代码不 ...
- 转 Python爬虫实战二之爬取百度贴吧帖子
静觅 » Python爬虫实战二之爬取百度贴吧帖子 大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 本篇目标 ...
- Netty 仿QQ聊天室 (实战二)
Netty 聊天器(百万级流量实战二):仿QQ客户端 疯狂创客圈 Java 分布式聊天室[ 亿级流量]实战系列之15 [博客园 总入口 ] 源码IDEA工程获取链接:Java 聊天室 实战 源码 写在 ...
随机推荐
- 微信小程序animation有趣的自定义动画
这几天在看代码时遇到了一些问题:关于微信小程序的animation自定义动画自己没有系统的学习过 做动画需要我们将一个复杂的动作过程,拆解为一步一步的小节过程 微信中已经为我们写好了端口我们只需要实例 ...
- Linux Shell编程,使用随机数
Shell有一个$RANDOM环境变量,读取它可以获得5位随机数 在/dev下,有两个字符设备/dev/random和/dev/urandom,可以产生二进制随机数 其中,urandom为非阻塞随机数 ...
- 自动生成四则运算题目(C语言)
Github项目地址:https://github.com/huihuigo/expgenerator 合作者:马文辉(3118005015).卢力衔(3118005013) 项目简介 1题目:实现一 ...
- Python爬虫系列(五):分析HTML结构
今晚,被烦死了.9点多才下班,就想回来看书学习,结果被唠叨唠叨个小时,我不断喊不要和我聊天了,还反复说.我只想安安静静看看书,学习学习,全世界都不要打扰我 接着上一个讨论,我们今晚要分析HTML结构了 ...
- AJ学IOS(51)多线程网络之GCD下载合并图片_队列组的使用
AJ分享,必须精品 合并图片(图片水印)第一种方法 效果 实现: 思路: 1.分别下载2张图片:大图片.LOGO 2.合并2张图片 3.显示到一个imageView身上 // 异步下载 dispatc ...
- SpeedButton
SpeedButton是一个图形控件,本身没有句柄.因此它不能具有焦点.你可以使用TBitBtn,调整一些属性,可以使他们的外形很接近. 只有从TWinControl派生的控件,才具有Handle.你 ...
- 爬虫的新手使用教程(python代理IP)
前言 Python爬虫要经历爬虫.爬虫被限制.爬虫反限制的过程.当然后续还要网页爬虫限制优化,爬虫再反限制的一系列道高一尺魔高一丈的过程.爬虫的初级阶段,添加headers和ip代理可以解决很多问题. ...
- How Many Answers Are Wrong HDU - 3038 (经典带权并查集)
题目大意:有一个区间,长度为n,然后跟着m个子区间,每个字区间的格式为x,y,z表示[x,y]的和为z.如果当前区间和与前面的区间和发生冲突,当前区间和会被判错,问:有多少个区间和会被判错. 题解:x ...
- X - Ehab and Path-etic MEXs CodeForces - 1325C
MMP,差一点就做对了. 题目大意:给你一个树,对这个树的边进行编号,编号要求从0到n-1,不可重复,要求MEX(U,V)尽可能的小, MEX(x,y)的定义:从x到y的简单路径上,没有出现的最小编号 ...
- X - Skyscrapers (hard version) CodeForces - 1313C2
题目大意:n个高楼,每个楼最高为mi,要求,第i个楼左边和右边不能有同时比它高的楼.让你求最在n个楼总和最高的情况下,每个楼的高度. 题解:用单调栈来做,n个楼的高度要么是单调递减,要么是单调递增,要 ...