本文首发地址:http://www.162cm.com/archives/1065.html
这是对http://www.flax.co.uk/blog/2009/04/02/xapian-search-architecture/ 的简单翻译.
严格意义上,这篇投递跟flax无关,只是为向直接使用Xapian的人们介绍一下Xapian搜索的体系结构。这不是给有经验的Xapian hacker提供的,也不是介绍如何使用Xapian的入门文章(入门文章请访问这里)。
Xapian API是相当复杂的,而且在索引和搜索时,QueryParser,Term,document values 经常困惑着人们.要特别指出的是,Xapian本身并无一个”field”的概念,field这东西是flax的组件做的更高层次的抽象和封装.Xapian只是有Document ,包含一个整数标识ID,document包含:
Terms (通常是词或短语,可以带位置信息,带位置信息的叫POST),
VAlue (通常是一个简短的字符串,也可能是包含的二进制数据),以及
data (可以是任何数据,但往往是一些适合显示的文本)。
这三种类型的对象是完全独立的,虽然在一个应用程序级相关(terms经常是从document data中切分得到的)。在索引时,Term会由一个文本处理器生成,当然也可能是单独地直接给出.term一般是专为字串搜索设计的 –比如一个特定的词是否在某个文档中出现?Value被用于其他多种用途,例如如范围搜索(如日期),排序,以及其他一些跟应用程序相关的方面。document data不能被用于搜索,它主要被搜索程序在得到搜索结果后使用,像是在搜索结果列表中显示文件的信息等.
当document被添加到一个Xapian数据库时,term,value和document data会单独存储在专门为了查询而优化的不同的数据结构里.如下图显示:
这是搜索过程的一个相当简化的说明.但从根本上来说,查询就是对term和value的匹配.一个典型的查询可以是如下示例:
llamas和yaks
Xapian匹配器查找数据库中的词条,并收集一个含有这个词条的document的列表。如果查询只包括terms,那么这个列表就构成了一个搜索结果并作为一个MSet返回给客户端代码。
但是,如果查询包含range组件(如范围2009年1月1日- 2009年4月2日 ),那将会需要一个寻第二查询阶段。匹配器会检查候选MSet中每个document中相应的value,并与查询范围比较。如果它不属于查询范围,该document就被弹出结果集,否则该document就被返回到客户端。
最后,通过自定义一个MatchDecider类的子类,还可以定制Xapian的搜索过程.这些子类可以访问document的任何属性,但因为性能方面的原因,通常只使用value。比如说,一个典型的应用是,根据用户的权限来过滤搜索结果:匹配器会比较用户的权限等级和候选文档的ACL设置,并决定是否在查询结果中返回该文档.
搜索优化
虽然这个模型过于简单,它仍然可以帮助我们改进数据库设计和搜索规划。在一般情况下,在磁盘上,term和postion list比value要远大得多,因此基于term的搜索一般受限于IO.这就是为什么有足够的RAM来提供磁盘缓存(数据库大小的10%或以上)时,搜索性能可以大大提高的原因。
相比之下,value range的搜索和匹配器的计算更密集,往往是受CPU限制。在查询没有指定任何term以限制候选MSet的大小时,单儿的value搜索会一个个地碾过所有的文档集(documents),在大型数据库上这个会灰常灰常地慢.
如果需要range查询搜索,添加一个term条件以给数据库分区,可以大大减轻性能压力.例如,日期可能由一个合适的索引前缀+YYYYMM构成的term来描述。然后,一个对日期范围的搜索就可以由一个term搜索来完成,这能大大减少要处理的document数量.例如,,2009年1月16日- 2009年4月2日的日期范围搜索可以由:
(XD200901或XD200902或XD200903或XD200904)的term搜索来限定.
这包括1月到4月的数据,超过必要的数据了,但是随后的范围子搜索中我们会去掉多余的数据。这时这个term搜索会大大减少需要处理的文件的数量,进而提高搜索速度。
不过,必须选择适当级别的粒度.如果我们按单天产生term而不是按月,日期term将产生76个,在IO方面可能就会有性能风险。
所有这一切都是相当复杂的,这就是为什么我们添加到flax中来处理的原因。我们搞flax的目标是针对数据源输入的各式的数据文档,能自动地产生优化的规划.而用户不太需要去关注这个过程请继续关注这里的消息以获得更新的消息:http://www.flax.co.uk/
分享到:
相关推荐
以Xapian 为核心开发一个搜索程序,以13 年第一季度的新浪新闻为检索目标,自行设计文档解析程序、调用xapian 建索引并实现一般检索、以及一个特殊的修饰符搜索功能(如url 搜索、标题搜索、时间搜索等),程序运行...
在处理过程中,Xapian提供了一种高效的数据结构,如`Document`,用于存储这些信息。 在分词阶段,可能需要自定义分词规则,这可以通过实现`xapian.TermGenerator`接口来完成。默认的分词规则可能不适用于所有情况,...
首先,我们要了解Xapian的基本结构。Xapian的核心组件包括索引器(Indexer)和查询处理器(Query Processor)。索引器负责处理原始数据,创建索引,而查询处理器则解析用户输入的查询,然后在索引上执行搜索。 1. *...
Xapian是一个强大的开源全文搜索引擎库,专为高效的信息检索设计。它由C++编写,提供了丰富的API供开发者在各种应用程序中集成全文搜索功能。Xapian的核心特性包括高效的倒排索引、多字段搜索、模糊匹配、同义词支持...
#### 六、Xapian的内部结构 - **Documents**:每个文档由一个唯一的整数ID标识,没有字段的概念。 - **Terms**:带位置信息的词或短语,用于文本搜索。 - **Values**:短字符串,用于二进制范围搜索和排序。 - **...
Xapian是一个开源的搜索引擎库,采用通用公共许可证(GPL)发布。它最初是用C++编写的,通过绑定支持多种编程语言,如Perl、Python、PHP、Java、Tcl、C# 和Ruby等。Xapian基于概率信息检索模型,是一种高效且灵活的...
C++开源搜索引擎Xapian是一个高效、可扩展的库,专为全文搜索和信息检索设计。本篇将介绍如何入门Xapian的开发,带你了解其核心概念、安装过程、基本用法以及如何通过C++接口进行操作。 首先,Xapian的核心特性包括...
Xapian是一个强大的全文搜索引擎库,因其高效、可扩展和高度可定制的特性而在信息检索领域广泛应用。然而,对于Windows平台的开发者来说,Xapian的官方支持并不像在Linux或Unix系统那样完善。在这种情况下,我们需要...
1.2.1 垂直搜索的应用场景 1.2.2 垂直搜索的技术选型 1.2.3 垂直搜索的引擎架构 1.2.4 垂直搜索技术和业务细节 1.2.5 现场答疑【Q&A】 2、知识扩展 2.1 淘宝类目及标题相关性分档计算方法 2.1.1 系统预测该关键词所...
Xapian是一个开源搜索引擎库,从原理上说,Xapian是一个信息检索系统。Xapian使用C++编写,遵循 GNU Lesser General Public License(LGPL)开源协议。Xapian支持多种编程语言,包括PHP、Python、Java等。 四、基于...
**Xapiand** 是一个基于 **Xapian** 库构建的现代、快速且易于使用的 RESTful 搜索引擎。这个项目旨在提供一个轻量级、高效且高度可配置的解决方案,用于索引和搜索大量数据。它允许通过 HTTP 接口与服务器进行交互...
免费开源的中文搜索引擎,采用 CC 编写 基于 xapian
索引是将非结构化的文本数据转化为可供快速搜索的数据结构的过程。Xapian提供了丰富的API,使得开发者可以方便地创建、更新和查询索引。在C++中,我们通常会创建一个Xapian::WritableDatabase对象来写入索引,以及一...
Xapian-Core是著名的全文搜索引擎库,它为开发者提供了强大的信息检索功能。版本1.4.9是Xapian的一个稳定版本,其针对Visual Studio 2017进行了优化,使得在Windows 64位环境下进行开发和编译变得更加便捷。这个...
在Windows平台上使用C#编译和使用Xapian搜索引擎是一个技术性的任务,涉及到多个步骤和注意事项。Xapian是一款开源的信息检索库,它提供高效、灵活的全文搜索和相关性排名功能。以下是一些关键知识点: 1. **C#与...
《acts_as_xapian:为Ruby on Rails打造的Xapian全文搜索引擎插件》 在Web开发领域,全文搜索引擎能够极大地提升用户对信息的检索效率,对于内容丰富的应用尤其重要。Ruby on Rails作为流行的Web框架,有着众多的...
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
Xapian绑定注意:不能保证此程序包功能齐全! 使用风险自负! xapian-bindings是一个元软件包,可简化针对Python的扩展的安装。 它根据安装的的版本确定要使用的xapian-bindings的版本。 下载并提取源代码; 然后...
Xapian::机架Xapian::Rack 提供了一个机架中间件,... 要执行搜索: query = request[:query] || ""search = Xapian::Rack.get(request.env)results = Xapian::Rack.find(request.env, query, {:options => Xapian::Qu
【课程大纲】 搜索引擎技术教程 网络搜索引擎原理-第1章 简介 共21页 搜索引擎技术教程 网络搜索引擎原理-第2章 爬虫 共64页 搜索引擎技术教程 网络搜索...搜索引擎技术教程 网络搜索引擎原理-第7章 Xapian简介 共39页