网络搜索引擎原理-007.Introduction to Xapian

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Xapian多索引字段

内部只有一个索引
– – –
使用前缀解决 Xappy采用固定2个字母做字段前缀 例如: Title:2012 -> TT2012
Xapian搜索

读写不冲突
– –
支持有限版本的MVCC(多版本并发控制) 如果写过于频繁,就出现读失效(需要reopen)

可以对数据库rebuild提升读性能
Xapian数据压缩

Xapian会有很多预留空间,便于快速修改 可使用xapian-compact工具进行压缩
– – –
数据库变小 搜索会更快 但修改会变慢

仅仅在很少修改的时候做这个
各种复杂的应用
Xapian vs. Sphinx





Xapian 25年历史 C++ 嵌入式 写慢但读很快 无统计功能 利用磁盘存储结构 适合构建搜索引擎





Sphinx 起步2003年 C++ 服务器 和mysql整合好 提供SQL API 索引推荐在内存中 适合更复杂应用
Xapian写入速度

Commit 保证修改的原子性Atomic

大量数据逐一写入commit会很慢

解决方法

批量添加,成批commit

Commit之前只是内存操作
– –
hack代码,不做完整性检查 多机分区索引,事后合并

Xapian-compact --multipass
Xapian并行修改



Xapian术语

Document ,document id : 一个整数

没有字段!

terms 带位置信息的词或者短语,文本搜索 values 短的字符串,用于二进制范围搜索和排序 document data 用于返回显示的任何数据,不能搜索


首先在Terms里面找documents 限定范围

相关性:enquire.set_sort_by_relevance()
– –
默认是按Rank算法计算BM25 可使用BoolWeight,采用进索引顺序,快速

配合enquire.set_docid_order

按照其他属性排序:
enquire.set_sort_by_value() value必须统一为可排序的字符串 – enquire.set_sort_by_value_then_relevance() std::string Xapian::Document::serialise() const Serialise document into a string. – enquire.set_sort_by_relevance_then_value() – 自定义算法



继续用数据库本身索引 lucene solr Xapian SphinxSearch
数据库自身索引
典型——Mysql


fulltext索引性能不佳、功能不强 多值属性(比如tag)很难做索引 每次查询的时候,只能利用一个索引
– –
组合查询,需要建立很多多列索引 太多索引导致索引膨胀,性能降低


地理位置排序 图片相似性排序
BM25排序算法

基本形式 Score(Q, d ) Wt R(t , d )
tQ

Wt的确定 IDF (t ) log
相关性R
N nt 0.5 nt 0.5
dl K k1 (1 b b ) avgdl

ft (k1 1) qft (k2 1) R(t , d ) ft K qft k2
索引数据库位于远端的服务器 直接打开远端的数据库 2种方法

Prog

Xapian.database(Xapian::Remote::open("ssh", "search.example.com
xapian-progsrv /var/lib/xapian/data/db1"));

服务器

xapian-tcpsrv: --port 33333
tQ

通常有qfi =1 Score(Q, d ) log
N nt 0.5 ft (k1 1) nt 0.5 ft K

Xapian的BM25(Default: k1=1,k2=1,b=0.5)
(rt 0.5)( N nt R rt 0.5) ft (k1 1) qft (k2 1) Score(Q, d ) log ( R rt 0.5) (nt rt 0.5) ft K qft k2 tQ
Lucene /Solr


Java开发的老牌搜索引擎和服务 可移植性较好,适合JAVA原生开发 Lucene相对Xapian
– –
Lucene的可扩展性不强(略) 对大数据量的支持需要深入调校(专业性)

性能一般(传Sphnix要快2-4倍)
Xapian


使用C++开发 del.icio.us (1亿书签) Gmane (9千万条消息) Douban
网络搜索引擎原理
Xapian简介
陈光 (chenguang@bupt.edu.cn)
信息与通信工程学院
典型应用场景



本地存储了大量文本数据(本地或采集) 需要独立的搜索引擎 不仅仅是全文索引 需要数据库的各种复杂搜索
– – – –
高性能 多条件 排序 统计 比如tag

支持多值字段查询

产品的选择


Why Xapian?

针对具体应用:灵活 or 速度? 独立 or 整合? Sphinx
– –

索引建立靠配置文件 Sphinx的attribute全部在内存里面,不灵活

Xapian更简单可控

嵌入式,不需启动服务


代码量不大
总体结构比较简单
Basis of Xapian
搜索服务
索引 Index
类搜索引擎的简单服务
Xapian performance

非常好 5亿网页,1.5T数据库文件

小于1S

Gmane:9千万邮件,单服务器
sphinx
• 最大:boardreader.com 论坛搜索引擎,20亿份文档(50亿?),2TB(6TB?) • 最忙: craigslist.org, 免费的分类广告站点(美国的top10), 每天5千万请求

ቤተ መጻሕፍቲ ባይዱ


Full range of structured boolean search operators
("stock NOT market", etc)

stemming of search terms —— 近似词 Wildcard —— 任意匹配(xap*) Synonyms —— 同义词 Facet search —— 分面搜索
Import xapian database = xapian.WritableDatabase('test/', xapian.DB_CREATE_OR_OPEN) #创建文档对象并修改 doc = xapian.Document() doc.set_data(―你相信2012预言吗?”) doc.add_posting(―你”, 1) doc.add_posting(―相信”, 2) doc.add_posting(―2012”, 4) doc.add_posting(―预言”, 8) doc.add_value(0, ―20121221‖) doc.add_value(1, ―2012”) # 添加并写入数据库 database.add_document(doc) database.commit()
Xapian::Database database(Xapian::Remote::open("searchserver", 33333));

Xapian备份
采用原始方式 停止写数据库,拷贝数据库 使用支持快照的文件系统 (LVM - Logical Volume Manager) 无法增量备份
查相应的value,进行排序。如
果数据量大,这个过程可能比较 慢。 如需要,把data取出,显示完 整内容
尽量减少第一步的搜索结果量 另外,Sphinx也是这个原理。 只是为了提高性能,把value全部 放入内存了。
Xapian Database

必需

– –
Posting list table —— 每个term 包含的documents
Xapian-backend存储格式

flint :1.0 ——以块的形式来存储,默认每块是8K, 理论上每一个文件最大可以达到2048GB chert : 1.2 数据库更小,但搜索更快
Brass :更好的支持replication (开发中) Remote:远端的数据库



Xapian的python接口
Xapian组合搜索

xapian.Query(op, query1, query2)
– – – – – – – – –
OP_AND OP_OR OP_AND_NOT OP_FILTER OP_AND_MAYBE OP_XOR OP_NEAR OP_PHRASE OP_ELITE_SET
使用QueryParser
搜索Search
关系数据库
文件
索引 数据库 NoSQL数据库 异步、实时 各种数据源 Web 应用
Xapian特性

Ranked probabilistic search —— 重要词汇 Relevance feedback —— 相关的文档 Phrase and proximity searching

类Google搜索
– –
paas site:everydo.com –Service 直接简便!

qp = xapian.QueryParser() qp.set_database(database) query = qp.parse_query(query_string)
Xapian排序
Xapian缓存提速

没有特殊的缓存控制 全靠操作系统对硬盘读写的缓存
Xapian分库查询

索引数据量太大,如何可扩展?
– – –
更新慢
搜索慢 伸缩性小

按不同维度分拆成多个索引
– –
按照不同栏目 不同的类型的数据

轻松支持多库搜索

Add_database
Xapian分布式搜索


Xapian: SWIG( Simplified Wrapper and Interface Generator)自动生成的接口
底层,功能强,但使用不方便

Xappy:高层的封装


对多字段场景,使用更简单
太自动化,不灵活


不是很成熟,跟不上xapian的变化
理解原理即可,不推荐使用
Xapian sample —— 建立索引
Record table —— document关联的document data Term list table —— 每个document包括的所有term

可选

position list table —— 每个term出现的位置

– –
value table —— 主要用于保存、排序等
Spelling table —— 拼写纠正 synonym table —— 同义字典

不可以并行修改!


单写多读
与SQLite一样,嵌入式的通病

会导致数据库崩溃!
– –
xapian的lock机制有bug
检查是否崩溃

xapian-check foo/termlist.DB
Xapian sample —— 搜索
import xapian database = xapian.Database('test/') enquire = xapian.Enquire(database) terms = [―2012”, ―相信”] query = xapian.Query(xapian.Query.OP_AND, terms) enquire.set_query(query) matches = enquire.get_mset(0, 10) count = matches.get_matches_estimated() for match in matches: print match[xapian.MSET_DID] print match[xapian.MSET_PERCENT] print match[xapian.MSET_DOCUMENT].get_data()
相关文档
最新文档