Sphinx+Python+Oracle构建全文检索系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Sphinx+Python+Oracle构建全文检索系统摘要目前,很多大型企业的crm系统在构建时都是采用oracle 作为数据库,本文正是为这类系统提供一个可以作为参考实现的基于sphinx的站内全文检索系统的实现方法。
关键词全文检索;sphinx;站内检索
中图分类号tp392 文献标识码a 文章编号
1674-6708(2011)54-0171-02
1 sphinx简介
sphinx是一个在gplv2下分发的全文检索软件包,是sql phrase index的缩写。它最初开发的目的是为了在数据库驱动的网站中寻找解决索引质量、搜索性能等各方面的问题而开发的一个高性能独立的全文搜索软件包,所以它可以非常容易的与sql数据库集成,为数据库驱动的网站提供高质量、高性能的站内搜索。
当前,sphinx系统内置了mysql和postgresql数据库数据源的支持,也支持从管道标准输入读取特定格式的xml数据。但是,目前sphinx还不支持直接将oeacle数据库作为数据源,但在最新的版本中,添加了python数据源支持,这极大的扩展了数据源的来源,我们可以操作python脚本作为数据源来获取oracle中的数据。
2 python数据源操作oracle数据库的设计与实现
考虑到安全、性能等因素,目前,很多大型的网站,尤其是大型企业的crm系统,在数据库构建方面都采用了oracle数据库。
基于此,我的研究正是基于oracle构建的大型企业crm系统,借助sphinx软件包提供全文搜索功能,同时结合mmseg中文分词软件包来为网站生成一个功能强大的站内搜索引擎。
2.1系统目标
本系统要实现一个基于oracle数据库构建的企业crm系统的高效的全文检索系统,并保证查询性能和查询结果的准确性,具体应满足以下两方面要求:
1)在数据量较大时具有较高的查询性能,在海量数据检索时仍能保持较快的响应速度和准确率;
2)以crm系统在oracle数据库中所存储的数据为检索目标,系统提供易于操作和使用的查询接口,用户可以通过该系统检索crm系统上所有的网页内容。
2.2所需软件包
coreseek:基于sphinx研发的支持中文全文检索的软件包,可以从coreseek官方网站中获得,同时还可以获得源代码和二进制包。该发布包中目前主要包括一个创建全文索引的indexer;一个用于测试的search;一个守护进程searched以及一系列的客户端api。
python:利用python操作数据库获取数据。
cx_oracle:python操作oracle所必须的扩展包。注意根据oracle和python的不同版本下载不同的cx_oracle扩展包。
2.3系统实现
1)系统配置文件
db.conf数据库配置文件,其中主要是对每批次读取的文件数目、数据库服务器地址、端口号、用户名、密码以及数据库默认的字符集等相关信息进行配置,供python读取。
sphinx.conf是检索服务的配置文件。该文件主要是定义了数据源类型、索引及它们所在位置,同时该文件中还定义了searched
服务的相关参数。对于数据源的类型及所在位置的定义如下:2)python定义数据源
python类定义为mainsource,程序主要是结合cx_oracle中的api链接oracle数据库,并从中检索数据,python中包含的主要方法及其相关描述如下:
getscheme:返回所有需要被索引的字段的属性;
getfieldorder:获取字段的优先顺序;
connected:连接数据库;
nextdocument:获取实际的需要参与检索的数据,按条获取,需要获取的字段,作为self自身的属性给出,每次读取一条数据。
3)创建索引
索引的数据可以有各种各样不同的来源:sql数据库、纯文本、html文件等等。对于本系统来说,索引的数据则来源于oracle数据库,并最终形成结构化文档集合形式的索引数据,而这个结构化
的文档集合对于搜索引擎的性能和检索数据质量的影响是至关重
要的。因此如何建立一个高效的索引是实现搜索引擎所必须面对的挑战。
由于大型企业的crm系统无时无刻都有数据更新,如果每次都是更新整个索引表,势必会有非常大的系统开销,从而影响性能。因此,在我们的系统中设置两个数据源和两个索引,一个主索引,主要是针对于那些从不更新或很少更新的数据;另一个是增量索引,主要是针对于那些更新频率非常快的数据。这样,系统采用“主索引+增量索引”(main+delta)模式来实现“近实时”的索引更新。
在配置文件sphinx.conf中对应的主索引和增量索引的定义如下:
4)java调用sphinx api实现全文检索功能
sphinx提供了php、python、perl、rudy和java搜索api支持。本系统是采用java语言实现,因此我们调用了sphinx提供的java 开源软件包。
具体实现检索时,是通过调用sphinx api进行。sphinx软件包提供的守护进程searched是系统中实际用来处理查询的部分,负责接受查询请求,并对接收到的检索字段进行分词,然后在全文索引中进行检索,并把检索后的结果通过api返回给客户端。
系统提供基于web的查询接口,通过java语言调用sphinx api
中的方法并构造sphinxclient对象,并在初始化时指定sphinx所在的服务器地址及端口号,同时设置匹配模式setmatchmode、排序模式setsortmode及权重setweights等信息。在全文检索时,我们调用sphinxclient中的query进行查询操作,并通过sphinxresult获得查询结果。用户输入要查询的关键词后提交查询请求,searched接受通过api传递过来的查询请求并进行处理,生成的结果数据集再通过相应的sphinxresult对象返回给用户,用户在查询结果浏览页面可直接通过点击条目的链接来导航到相应
的页面。
3结论
对于一个采用oracle数据库构建的拥有大量数据的crm系统来说,定制自己的站内搜索引擎,是克服传统的数据库字段检索技术所带来的无法完成全文检索,无法支持分词等功能的最佳方案。借助于本文所介绍的sphinx+python+oracle构建站内全文检索系统的方法,不仅可以在构建企业crm系统初始就考虑到将sphinx整合到系统当中,实现站内全文检索功能,而且也可以在不对现有crm 系统的原有架构进行修改的情况下便捷的为网站提供一个性能优
越的站内搜索系统。
参考文献
[1]shijin yuan,binmu,xianing zhang. implementation for full-text search and rank optimization in e-commerce. 2010