网络搜索引擎原理-007.Introduction to Xapian
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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()