全文检索系统
“大文本”字段的信息检索方案
产品背景
在今天,传统的表单式的,结构化信息的检索方式已经不能完全满足用户的需求。例如:在关系型数据库中,对大文本数据的检索,和大信息量(50万条记录以上)的模糊查找(用like关键字)的效率低下;而且通过填写多个表单项组合查询来检索数据的方式,也让最终用户感到困惑。
大家期望使用更简单的方法,更加快捷有效的找到所需要的信息(Google和BaiDu的成功就是很好的例证)。
为了快速、准确的帮助用户检索各种信息,有效的提高整个系统检索能力,北京杰软科技有限公司(以下简称:杰软科技)提出了将全文检索引擎,和结构化信息检索方式结合起来进行查询、检索的解决方案,来完成在海量数据库中的复杂的检索任务。
该解决方案涉及中文分词、智能查询分析、全文检索、检索结果评分等多个领域内的技术成果,我们采用Lucene、ICTCLAS等多个开源项目的成果,在此基础上进行改造,实现整个系统设计开发工作。
杰软科技开发新一代的Search3.0全文检索系统,实现结构化查询和全文检索技术结合的方式,为用户提供更加智能(分析用户的查询目标)、高效、准确的检索服务。
l 系统应当同时具有结构化数据检索以及全文检索能力
l 具有较好的查询时间性能;
l 具有尽可能高的全文检索召回率与准确率;
l 尽量保证用户期望的查询结果排在整个结果集的前部;
l 能够通过系统运行中积累的数据自动改善检索质量;
l 具有形式简洁、容易使用并且高效的查询条件输入界面;
l 具有便于使用、针对领域特点的查询语法;
l 系统可以适应不同库表结构的数据库;
l 对于数据量较大的数据库,建立并维护全文索引的时间性能与资源消耗应当控制在合理的范围之内;
l 系统的主要方面应当易于扩展以适应需求变更。
在我们进行系统方案设计时充分考虑到了如下4个原则,并将始终贯穿于设计和开发过程中:
目前,很多用户采用结构化数据的检索方式,在大文本的数据检索方面存在一些障碍,但整个检索结果的准确率相对较高。
而我们将要采用的全文检索系统,受全文检索关键字的整理过程和智能用户查询条件分析的技术限制,可能会出现检索结果不准确的问题。
为了解决这个问题,我们引入了检索结果评分的方式,通过分词、检索、访问频度等多因素进行计算后评分,并根据评分顺次显示。(评分最高的记录将出现在最前面,以此类推。)从而有效的保证系统检索结果的准确性。
同时,对检索结果的评分过程是动态的,系统能够根据用户访问的频度、分词的准确性等指标动态的调整信息的分值。
(注:原有的结构化信息的检索方式依然保留,本系统所提供的全文检索功能将和现有的结构化信息检索方式结合起来,共同承担整个系统的检索工作。)
系统的稳定性也是我们设计的重点之一。
该系统能够在任何情况下(多并发、多用户、多会话、内存开销大、系统运行效率低等其他特殊的情况)保持正常运行的状态。
我们所采用的全文检索引擎是基于Lucene技术的成熟系统,目前的1.4.3版本运行稳定,有众多的知名网站采用该引擎,这也为本系统的稳定、可靠提供了有力的保证。
评价全文检索系统的效率通常指两个方面:生成索引文件的速度(分词的性能)和最终用户检索的性能。在这里我们更关心用户使用全文检索功能时所表现出来的运行速度。
确保系统运行的高性能也是我们设计的重点之一。
全文检索系统的运行速度很大程度上受制于全文检索的引擎。而我们所选择的Lucene引擎在检索信息时的性能是非常有优势的。
该系统不是一个专用系统,但是为了更好的在专用领域内提供检索服务,该系统仍然需要具备一定的灵活性和较强的可扩展性,以适应该技术在各种应用中都能够提供更加准确的服务。(例如:在分词的过程中,需要加入一些特殊的处理,以保证分词功能的准确性。)
为此,我们将采用XML文件来描述所有的结构化数据源、分词库的位置,而且采用外挂式的检索结果评分机制,使得评分算法可以根据不同的应用进行切换等等。
分词、全文检索、评分机制等模块的相对独立,也为整个系统的可扩展性提供有力的保证。
图3-1 系统流程图
本系统的核心是对Lucene全文检索引擎的改进,而对全文检索的改进的核心又是分词,包括将大文本信息中的关键字进行分词,建立索引;以及对用户输入的查询条件进行分词,分析关键字。
所以,我们的基础工作主要从以下两个方面开展:改造Lucene全文检索引擎;改造中科院计算所的Free ICTCLAS分词系统。
l 改造Lucene全文检索引擎;
首先,通过调用Lucene所提供API实现创建索引及全文检索的功能。然后我们需要对全文检索进行如下方面的改造:
1、分词部分:由于Lucene是由国外独立机构提供的全文检索引擎,因此其创建索引文件时的对关键字的分词功能可能不够完善,我们将采用中科院计算所的ICTCLAS系统来完成其部分分词功能,存放在扩展字典里(或直接生成索引文件)。因此Lucene需要能够从扩展字典中进行分词,并建立索引文件;
2、在索引文件中加入结构化数据的唯一标识(如:Job_ID);
3、在索引文件中加入评分信息,用于对检索结果进行排序;
l 改造中科院计算所的Free ICTCLAS分词系统;
在本系统中,最终检索的效果主要取决于分词系统的准确性,因此我们要对ICTCLAS分词系统进行全面的了解及改造。主要进行如下方面的工作:
1、针对特定的应用扩展分词字典库,提高分词的质量;
2、对ICTCLAS分词系统中现有的一些限制(Bug)进行预处理;(如:去除标点、HTML标签、Unicode转义符号、虚词等,并对一些信息进行合并)
l 对于和应用系统接口的数据结构、XML文档进行定义;
1、考虑本系统的独立性,我们需要对和应用系统的数据库SQL Server中相应表的接口在XML文件中进行描述;
2、分词字典采用外挂式,在XML文件中进行描述,可以通过外挂不同的分词字典及XML的描述使得系统的可扩展性大大的提高。
Lucene全文检索引擎的索引数据是以文件的形式存储的,因此我们需要了解其索引文件的构成,并重新生成索引文件。
全文检索引擎所创建索引的准确性直接影响到最终检索的效果,而目前Lucene在处理中文文档时仍有不少缺陷,因此,我们需要对其进行扩展和修正,以适合系统的需要。
目前,我们对Lucene的扩展和修正主要集中在以下几个方面:
l 从结构化数据库中抽取大文本数据(包含ID);
l 分词;
关于分词,主要依赖于中科院计算所的ICTCLAS系统,但对其在以下10个方面进行预处理,以期提高分词的质量。
1、去除标点符号 /w
2、去除HTML标签
3、去除Unicode转义符号
4、去除虚词 /f /d /u等
5、合并某些形式的词组(如 三/m 层/q 结构/n)
6、去除数词 /m
7、替换\r\n \t
8、替换某些连续字符(.-*=)
9、将全角字符转换为半角字符
10、 为保证ICTCLAS正常分词,替换某些字符
l 多语言文本的划分;
目前,我们将主要针对简体中文和英文对其进行划分处理,对于其他语言的文本(如:韩、日、繁体中文等),暂时忽略处理。
l 评分;
根据关键字匹配的准确性、数量、用户反馈等多个指标进行评分,并在在索引中以Unindex方式存储评分结果。
同时,在数据库中记录相应的结构化记录的唯一标示,如职位的 Job_id。
l 更新、反馈。修改评分;
根据用户的查询频度和查询结果的命中率对相应的记录进行重新评分。
(问题:重新评分的操作什么时候触发?用户每次使用后立即修改吗?)
目前,大多数网站还都采用传统的表单式的,结构化信息的检索方式。尽管结构化检索的优点非常突出:准确、快捷,但其弊端也是显而易见的:对于大文本的检索效率低下,而且检索的结果召回率和准确性都满足不了客户的需求。
而且结构化信息的检索方式通常是让大家填写多项检索条件,这也使得系统的易用性大大的降低。客户希望使用更简单的方法,更加快捷有效的找到所需要的信息(Google和BaiDu的成功就是很好的例证)。
而基于全文检索引擎的查询技术则可以有效的解决结构化检索的问题,因此我们建议将“全文检索”和“结构化数据检索”进行集成,共同承担系统对检索的需求。
下面,我们将描述一下“全文检索”和“结构化数据检索”进行集成后的用户查询过程的实现流程,其内容主要包括:
l 分析查询项关键字
由于用户不再按照检索项逐条输入的检索关键字,而是在一个输入框输入所有检索条件,那么系统所需要作的第一步工作就是对关键字进行拆分,分析各项查询项。
例如:用户在职位搜索时输入:北京市项目经理。系统首先需要将其拆分成两个单词:北京市、项目经理;
注意:要考虑到客户可能输入:“工作时间>3年”这样的检索条件。
l 同义词
为了提高检索的召回率,我们对分解后的每一个关键字进行同义词匹配处理,将关键字的数量增多。
事实上,该操作是在已经预先构建好的同义词库中进行匹配,为了提高检索结果的准确性,同义词库的审查将会比较严格。建议通过程序辅助收集备选条目,但由人工确认后方可入库。
例如:经上一步分解完成的:北京市、项目经理两个关键字在这里被扩展成为“北京、项目经理、产品经理”三个关键字。
l 为每个关键字对应其结构化数据的字段;
为了提高检索的准确率,建议将结构化数据的检索和全文检索相集成,来共同完成检索功能。因此,需要为每个关键字明确其在结构化数据库中对应的字段名,以便于结构化数据的查询。
例如:经上一步完成的:北京、项目经理、产品经理三个关键字,分别被定位至:地域(Area)、招聘职位(JobName)两个字段。
l 结构化数据库的查询
通过对字段名和内容对应,在结构化数据库中进行检索。
l 全文检索
通过分词后的多个关键字,调用Lucene的引擎进行全文检索。具体如下:
1、根据QueryParsing的分析过程,生成Query对象;
2、根据全文索引条件生成的Query对象交给Searchable接口处理;
3、返回检索结果的Hits对象;
4、通过Lucene.Net.Search.Hit.Get(string)方法,在索引文件中获取查询结果的评分和对应的DB中的记录ID,如Job_ID。
l 对检索结果进行排序
对于包含评分的全文检索结果系统会通过分值逆序排列(从大到小),但全文检索的结果如何和结构化数据的检索结论共同排序呢?建议如下:
1、全文检索的结果和结构化检索重合的部分排在最前面;(具体顺序按照全文检索评分顺序)
2、结构化完全匹配的内容;(用 = 进行匹配的内容)
3、全文检索的内容按评分值逆序排列;
4、和用户所属分类建立关联,此关联数据将影响职位在同类用户查询结果中的排序;在没有其他排序规则时,此机制倾向于将较早登录的职位排在前面,应当对新登录职位的评分进行修正。
l 从DB中获得详细信息;
通过上面步骤获得的结构化数据库的唯一标识如Job_ID,在DB系统中进行定位,并取得该记录的所有信息进行展示,至此用户的一个查询操作完成,但从整个检索系统的角度来看,任务还没有完成。
l 记录用户的选择,修正评分;
现在,我们的查询系统已经为客户提供了众多的查询结果,但是这些记录里哪些是有效的、哪些是用户最关心、最贴切、最准确的、哪些是我们通过同义词为客户推荐,客户很满意的,系统当然还要记录。不过如果直接让客户填写问卷式的反馈表自然是不现实,也不友好的。
系统要能够根据客户选择的结果智能的进行记录,并最终作为评分的依据。
该系统(Search3.0)最终将替代结构化查询功能(或其中的部分)功能,可能会影响到很多用户的使用方式和使用习惯,因此如何有效、紧密、无缝的和现有系统进行集成,也需要重点考虑。
集成的工作包含两个方面:和结构化数据的检索进行集成,和现有网站系统进行集成。和结构化数据库的检索功能进行集成的示意图如下所示:
图3-2 和结构化数据进行集成
除了需要在数据层面和结构化数据进行集成外,该系统还需要和正式的系统相集成。当正式的系统采用该方案作为查询功能的部分或者全部后,所有的查询结果的页面都会相应的改变,包括:
1、显示结果集的方式;
2、列表、翻页、排序等功能;
3、在结果集中继续查找;
l 触发机制;
当用户更新个人信息或其他用于全文检索的资料时,系统应该能够自动通知全文检索引擎对相应的索引进行更新。
l 其他;
4. 系统的主要特点:
l 主要针对关系型数据库无法处理的大文本字段,为其提供索引功能;
l 企业级应用解决方案,具有高度的准确性、稳定性;(具有智能分词、评分、排序等功能)
l 可以和结构化数据的检索方式结合使用。
雷之宇
北京杰软科技有限公司
Web Site:
Address: 北京市上地信息产业基地开拓路11号,福道大厦3层
Zip: 100085
Tel: 010-82781921,82781931