给这篇文章去了一个很潮的名字。充分的说明了这个过程是一个痛并快乐这的过程,xapian是老外的东西,中文资料少的可怜,很多东西都是自己慢慢摸索的。于是就想这写点动总结一下使用的心得。废话少说,言规正传。(一下涉及到代码部分全是用python)

 

1.xapian表

《《利用xapian构建自己的搜索引擎》》里已经讲的很明白,下面是copy下来的。

l         posting list table 保存了被每一个term索引的document,实际上保存的应该是document在database中的Id,此Id是唯一的。

l         record table 保存了每一个document所关联的data,data不能通过query检索,只能通过document来获取。

l         term list table 保存了索引每个document的所有的term。

以下的表是可选的,即当有以下的类型的数据需要被存储的时候才会出现(在1.0.1以前,position和value表就算是没有数据的时候也会被创建,而spelling和synonym表是1.0.2后才出现的)。

l         position list table 保存了每一个Term出现在每一个document中的位置

l         value table 保存了每一个document的values,values是用作保存、排序或其它作用的。

l         spelling table 保存了拼写纠正的数据。

l         synonym table 保存术语的字典,例如NBA、C#或C++等。

稍微的说一下,posting,record,term这里是必须的,但实际上record里设置是通过,一般的data就是全文,其实本质是用这个去做显示,如果有其他的方式显示的,这个就不是必须的。

1 document.set_data(data)

 

2. 多读单写

    意思就是只能有一个进程写database,多个进程读。重点在于前面的部分。有些时候我们会遇到这样的异常,其实这个问题就是在多个进程里同时去写database,也就是说定义了多个WritableDatabase对象。而每一个Xapian的database目录包含了一个名为“flintlock”的文件以作锁定用途,看到flintlock这个名字,就大致的知道它的工作原理。

 _xapian.WritableDatabase_swiginit(self,_xapian.new_WritableDatabase(*args))
 xapian.DatabaseLockError: Unable to get write lock on index: already locked

 

3. database

   就是xapian的索引文件。直接上段代码

 

代码
import xapian
text
= "Hello world"
SEARCH_DB
= xapian.WritableDatabase(DBPATH, xapian.DB_CREATE_OR_OPEN)
doc
= xapian.Document()
for t in text.split():
doc.add_term(t)
SEARCH_DB.add_document(doc)
SEARCH_DB.flush()

 

这里还必须提到一个概念就好XAPIAN_FLUSH_THRESHOLD,xapian的索引文件是储存在硬盘上的,如果在创建大量的索引文件而频繁的进行硬盘的io操作,就后导致性能的急剧下降。XAPIAN_FLUSH_THRESHOLD默认是1000,意思是database里增加了1000个document的时候往硬盘里写一次。当然这个值要根据自己机器的配置达到最合理的状态。

 

未完待续。。。