关系型数据库与全文检索相结合的检索方法
技术领域
本发明涉及一种检索方法,特别涉及一种用于基于将全文检索机制与关系型数据字段检索相结合以提高检索效率的方法。
背景技术
关系型数据库和全文检索引擎是两种出现已久且发展相当成熟的技术,它们都可以提供数据的存储和检索。
关系型数据库要比全文检索技术历史更为久远,技术更为成熟,其发源于二十世纪60年代到70年代早期Edgar Codd所创立的关系型数据库理论,后人在他的理论基础上开发出了一系列的RDBMS。关系型数据的优势在于其对SQL标准的支持,检索语法规范、灵活、功能强大,以及其基于二维表的关系理论对复杂数据模型的支持,通过长期发展已经得到广泛应用,从最初的ODBC、ADO发展到现在J2EE领域的JDBC,SQL已成为数据库应用开发的关键技术之一。
相比而言,全文检索技术起步较晚,中文全文检索技术的研发更是始于1987年左右,但它发展迅速,尤其是近几年,互联网基础设施的逐步健全,网民人数的激增,以及网上搜索引擎的广泛应用,都极大程度地推动了全文检索技术的发展。全文检索的优势在于其对自然语言中的字、词和语法逻辑的充分挖掘,利用自然语言中的语义内涵,从而提供更高层次的检索语法,包括:单字检索、短语检索、整句检索、段落检索、邻接检索、权重检索、多域检索、逻辑检索、表达式检索、同义词检索、反义词检索等,这些都是SQL所达不到的。
目前,在实际开发过程中,对于关系型数据库和全文检索的运用有三种方式:
(1)数据库方式
数据库方式是单独基于关系型数据库进行数据的存储和检索,利用数据库的索引机制,对数据库字段创建索引,通过SQL脚本进行检索,数据库对脚本进行分析,形成查询计划,并根据已建立的索引情况使用相应的索引表,从而达到高效率检索的目的。
(2)全文检索方式
全文检索方式是直接利用全文检索技术,通过全文检索引擎对外部文件(本地或远程)创建全文索引,并从接口层面通过函数调用的方式提供检索服务。
(3)数据库与全文检索相结合方式
数据库与全文检索相结合方式是利用数据库与全文检索各自特点,通过将二者相融合,从而形成的一种检索技术。通常的做法是,对数据库字段创建全文索引,检索时将SQL脚本转换为函数调用从全文索引库中获取查询结果。
关系型数据库和全文检索技术二者间的检索机制完全不同,它们又各自有各自的优势,同时也有各自的弱点。本发明不是从二者的检索算法上来比较二者间的优缺点,而是从检索方法的使用上进行对比。
1.关系型数据库比较突出的弱点就在于索引机制的局限性,主要集中在以下三个方面:
(1)在对字符串型字段进行模糊匹配检索时,前包含(即以检索词开头的模糊检索)可以利用索引以达到高效检索的目的,但对于后包含(即以检索词结尾的模糊检索)和内包含(即检索词在中间的模糊检索)就无法利用索引以至于此类检索通常效率低下,这在长字符串字段情况下效率问题尤其突出。
(2)对于文本字段,包括:CLOB(Oracle、DB2)、Text(SQL Server、Sybase)等,因为无法创建索引,所以无法利用索引进行对此类字段的高效检索。第三种情况与具体应用有关,在数据库应用系统中,通常是将正文(文本类文件,如:TXT、Doc、PDF、HTML等)放在文件系统,数据库中只是记录一个路径(或URI),在这种情况下,数据库索引机制也是无能为力。
(3)最后的问题来自于检索条件的灵活性方面,数据库检索的检索语法来自于SQL标准,可以进行逻辑条件(=、<>、>、<、>=、<=、like、between and)、布尔检索(And、Or、Not)以及对检索条件进行分组从而满足大部分检索要求,但对于诸如单字检索、短语检索、整句检索、段落检索、同义词等基于词典的检索,就无法满足,而这却是全文检索的优势。
2.对于全文检索而言,目前还没有提出一种类似SQL的检索语法国际标准,更多的是从接口层面通过函数调用的方式提供检索服务,这是其不足之处。另外,全文检索不能提供绝对意义上的精确检索,这是其相对于关系型数据库的弱点之一。
3.在数据库和全文检索相结合技术领域,有些关系型数据库厂商也推出一些解决方案,如:Microsoft(SQL Server)、IBM(DB2)、Oracle(Oracle)等,都是在数据库基础上进行扩展,融入一些全文检索技术,但它们也都有一定的缺点:
(1)基本属于在数据库外挂全文检索引擎的方式,数据库检索与全文检索采用顺序执行的方式,即先执行全文检索再进行其他操作,检索性能不理想。下面是在相同配置条件下不同数据库对比数据(测试环境:Windows 2000server简体中文版,PIV 2GHz,2GB内存):
Oracle |
DB2 |
MS SQL Server |
一百万级数据,返回记录数>200时,查询时间7-27秒三百万级数据,返回记录数>500时,查询时间30-60秒 |
一百万级数据,返回记录数>200时,查询时间>30秒 |
一百万级数据,查询时间与返回记录数(X)存在明显关系:X<1000时为1秒以内,1000<X<10000时为秒级(1-20秒),X>10000时为10秒+(X-1万)*n毫秒(n:1-2之间) |
(2)对空间要求高,全文索引需要占用大量的磁盘空间,以DB2为例,通常是文档空间的0.7倍以上。对于Oracle,据测算,全文索引占用间为表数据占用空间的10-14倍,建立索引消耗临时表空间为表数据占用空间的4-5倍;
(3)对中文的支持不够
(4)查询语句不统一,没有形成标准。下面是其对比语句(仅限基本用法,并未包括高级用法):
Oracle |
DB2 |
MS SQL Server |
SELECT ProductName FROMProducts WHERECONTAINS(ProductName,′Computer′)>0 |
SELECT ProductName FROMProducts WHERECONTAINS(Produc tName,′”Computer”′)=1 |
SELECT ProductName FROMProducts WHERECONTAINS(ProductName,′Computer′) |
发明内容
为了克服上述缺陷,本发明的目的在于提供一种关系型数据库与全文检索相结合的高效检索方法。
为达到上述目的,本发明关系型数据库与全文检索相结合的检索方法,包括一个以上的数据库,并对每一个数据库中需要的属性字段创建数据库检索索引库和由全文检索引擎创建全文索引库,其中,数据库检索索引库与全文索引库中的属性字段不相同,其步骤是:
1)提交检索请求;
2)对提交的检索请求进行分拆,将检索请求中与专利数据库索引中的属性段相同的部分拆分成数据库检索SQL语句;将检索请求中与全文索引中的属性段相同的部分拆分成全文检索查询语句;
3)利用SQL语句提交数据库检索请求;
4)利用全文检索查询语句,提交全文检索请求;
5)将流程(3)与流程(4)的检索结果进行合并;
6)返回检索结果。
采用上述的方法后,充分利用全文检索引擎在大文本字段检索上的优势,在数据库检索中引入全文检索的机制,不但可以大大提高检索的性能,并且能够提全文检索引擎特定的检索机制,如:单字检索、短语检索、整句检索、段落检索、邻接检索、权重检索、多域检索、逻辑检索、表达式检索、同义词检索、反义词检索等。
附图说明
图1为本发明关系型数据库与全文检索相结合的检索方法的流程图。
图2为本发明关系型数据库与全文检索相结合的检索方法的拆分递交图。
图3为本发明关系型数据库与全文检索相结合的检索方法中创建全文索引库的流程图。
图4为本发明关系型数据库与全文检索相结合的检索方法中全文检索索引数据变更的流程图。
具体实施方式
如图1所示,本发明关系型数据库与全文检索相结合的检索方法采用的解决方案是:首先利用全文检索支持数据库字段建索引特性(支持数据类型(字符型、日期型、数值型)、支持排序、支持按条件查询),将数据库字段交由全文检索引擎创建全文索引。检索时根据建库阶段的定义,将数据库元数据检索与全文检索分开,即构造检索条件时二者互不干涉;然后即可对该数据库进行检索,其步骤为:
1)提交检索请求;
2)对提交的检索请求进行分拆(如图2所示),将检索请求中与专利数据库索引中的属性段相同的部分拆分成数据库检索SQL语句;将检索请求中与全文索引中的属性段相同的部分拆分成全文检索查询语句;
3)利用SQL语句提交数据库检索请求;
4)a、利用全文检索查询语句,生成全文检索XML请求数据包;
b、提交全文检索请求;
c、访问预设全文检索服务URL,将全文检索返回结果存入数据库临时表;
5)将流程(3)与流程(4)的检索结果进行合并或经过过滤、排序后合并;
6)返回检索结果,同时将结果放入缓存以便下次利用。
上述的方法充分利用全文检索引擎对数据库大字段建全文索引,在检索时,将检索请求分别同时转向数据库和全文检索引擎,再将后者的返回结果经过处理后与数据库检索结果快速合并,从而达到高效检索的目的。
上述的全文检索服务提供JSP/Servlet的调用方式,通过HTTP协议访问全文检索服务。另外,此设计方案可以使得系统可以同时支持多种异构全文检索引擎,通过对检索引擎接口API进行封装,保证全文检索服务的一致性。
在利用上述的方法进行检索时,创建生成全文检索XML格式的检索条件字符串,检索条件格式(DTD结构)如下例:
DTD |
XML示例 |
?xml version=″1.0″encoding=″UTF-8″?><!ELEMENT SearchCondition((ExpressGroup|Express)?,Operator,(ExpressGroup|Express))*><!ELEMENT ExpressGroup((ExpressGroup|Express)?,Operator,(ExpressGroup|Express))*><!ELEMENT Express (#PCDATA)><!ATTLIST ExpressFields CDATA #REQUIREDCondition(contain|precontain|backcontain|equal|more|moreequal|less|lessequal|unequal)#REQUIREDValue CDATA#REQUIREDType(0|1)#REQUIRED><!ELEMENT Operator(#PCDATA)><!ATTLIST OperatorOperate (AND|OR|NOT)#REQUIRED><!--Type:用于区分数据库检索/全文检索。0表示数据库检索;1表示全文检索 --> |
<SearchCondition><ExpressGroup><Express Fields=″Name″Condition=″contain″Value=″%博思%″Type=″0″/></ExpressGroup><Operator Operate=″AND″/><ExpressGroup><Express Fields=″Title″Condition=″contain″Value=″国际″Type=″1″/><Operator Operate=″AND″/><Express Fields=″CreateDate″Condition=″moreequal″Value=″2005-01-01″Type=″1″/></ExpressGroup></SearchCondition><!--本示例的检索条件分为两部分:数据库检索部分(Name包含“博思”和全文检索部分(Title包含“国际”并且CreateDate晚于2005-01-01) |
上述本发明的检索请求拆分时,检索条件可根据需要分拆为数据库检索和全文检索两部分,分别形成相应的查询语句,数据库检索条件要求符合标准SQL规范,全文检索条件要求符合全文检索语法规则,然后前者提交关系型数据库进行数据库检索,后者提交全文检索引擎进行全文检索,两检索可并行执行。
下面以上面检索条件XML示例为例拆分:
数据库检索:where Name like ‘%博思%’
全文检索:where Title:(国际)AND CreateDate:[2005-01-01,2005-12-31]
如图2所示,上述经过拆分的检索请求需要以特定机制传递给相应的检索引擎,其中,数据库检索需要借助ODBC/JDBC提交,而全文检索则需要利用Socket或HTTP等通讯机制提交。
本发明的检索方法可以支持同时部署多个全文检索服务,实现不同数据库分类同不同全文检索服务的挂接,全文检索服务在逻辑上相对独立,这样,在大数据量,多并发的情况下可以将对不同用户数据库分类的检索请求分布到不同的检索站点,产生分布式调度,对各个用户数据库的检索工作可以分别由相应的检索服务完成,以期达到检索负载均衡,从整体上提高查询效率。
本发明中的方案已经在方正博思3.5内容管理平台中试用,测试结果证明了其有效性和实用性。其中,全文检索引擎利用方正智思全文检索引擎,关系型数据库利用Oracle 9i。对比数据参考下面的测试结果:
测试环境:
测试环境 |
数据库服务器: |
O S:Windows 2000server简体中文版 |
数据库:Oracle9.2.0.1.0 |
数据库记录总数:2290416 |
CPU:双CPU(PIV 2GHz) |
内存:2GB |
硬盘:6个硬盘共170G |
中间件服务器: |
O S:Windows2000Professional简体中文版 |
中间件:Weblogic 8.1 |
|
CPU:PIIII 2.8GHz |
内存:512KB |
硬盘:80G |
测试结果:
检索词 |
返回记录数 |
数据库检索时间(秒) |
本发明方法(秒) |
单词 |
中国 |
310707 |
240.00 |
18.522 |
北京 |
159397 |
247.01 |
18.695 |
系统 |
140210 |
244.09 |
18.620 |
男性 |
27599 |
243.06 |
20.468 |
房地产 |
25184 |
247.04 |
20.725 |
词组 |
香港特别行政区 |
595 |
247.04 |
3.895 |
人民代表大会 |
12433 |
257.01 |
19.912 |
与操作 |
北京人民 |
22275 |
258.00 |
19.032 |
论坛时间 |
27000 |
251.05 |
20.138 |
下面以方正博思3.5为例进行描述,在具体实施方案上分为配置全文检索服务、建库、更新索引和检索四大部分。
1.配置全文检索服务
配置系统中部署的全文检索服务,包括:服务位置URI、服务范围(支持数据格式等)、输入参数(索引方式、存储方式、最大线程数等)等。可配置多个全文检索,并且可以部署在不同的物理节点,以提供分布式检索。
2.建库
建库包括创建用户数据库和全文检索库两个步骤,首先在创建用户数据库时在数据库中创建需要的属性字段,在创建全文检索库时,按用户数据库分类配置每一用户数据库对应的全文检索服务地址(URI),并允许指定该用户数据库下每一属性字段是否需要在全文索引库中创建全文索引。当全文检索配置完毕后,向全文检索服务发建库请求,并由全文检索服务统一调用全文检索引擎提供的建库接口完成建库过程。建库流程见附图3流程描述如下:
1)在博思中指定需要创建全文索引的属性字段;
2)在博思中向数据库发送创建用于全文检索引擎获取数据库字段的视图;
3)在博思中向全文检索引擎发送创建全文索引库的建库请求;
4)全文检索引擎在后台创建索引库。
3.更新索引
当数据库字段发生变更时(增加、删除、修改),系统将向增量表中插入变更记录,主要包括:数据标识、变更类型(增、删、改),全文检索引擎接收到变更事件后,通过数据库视图获取变更数据的具体信息,同时更新索引库。更新索引流程见附图4流程描述如下:
1)博思中数据记录变更(增加、删除、修改)
2)博思向变更增量表插入记录
3)全文检索引擎扫描增量表
4)从建库时创建的视图中获取变更数据
5)全文检索引擎更新索引库
4.检索
检索流程描述如下:
(1)提交检索请求;
(2)分解检索条件,拆分成数据库检索SQL语句和全文检索查询语句,分别进入流程(3)和流程(4);
(3)提交数据库检索请求;
(4)生成全文检索XML请求数据包;
(5)提交全文检索请求;
(6)访问预设全文检索服务URL;
(7)将全文检索返回结果存入数据库临时表;
(8)将流程(7)与流程(3)的检索结果进行合并;
(9)返回检索结果,同时将结果放入缓存以便下次利用。