张贝克,焦迪楠 ,马 昕,李晶晶
(北京化工大学 信息学院,北京100029)
随着计算机技术及网络的普及,人们对知识的获取不只来源于学校课堂,很大一部分来源于网络平台。如何为用户提供一个层次清晰、内容丰富的网络学习平台,成为国内外的研究热点及网络教学的趋势[1]。传统的网络学习平台大都信息分类简单,知识脉络不够清晰,而检索系统大多是基于数据库系统自带的查询命令,如“like%keyword%”的形式实现检索。这种检索方法不能分词、不够智能、检索结果的排列顺序也不够合理。针对传统网络学习平台的不足,本文提出的新型的网络学习系统不仅提供对知识信息的解读,还分析知识内部的联系,梳理知识脉络,将知识以立体网络的形式展现给用户,从而使用户对知识信息有更立体深刻的了解;同时为了能够保证用户高效、准确地检索到需要的信息,本系统的检索模块中引入了新型的专用于.Net平台的Lucene.Net全文检索技术。Lucene.Net是一个类库,提供了简单的函数接口,可以方便地嵌入到各种应用中实现全文索引与检索功能[2]。目前Lucene全文检索技术发展迅猛,很多项目都使用了Lucene作为其后台的全文检索引擎,如 Nutch(WebCrawler工具),Hadoop(基于Lucene的分布式计算平台)等[3]。本文通过对Lucene.Net的分析研究,将其与SQL Server数据库技术相融合,实现效率高、搜索结果准确的检索引擎模块。
本系统将零散的知识信息收集起来,进行科学的整理、分类,组织成一个知识网络,通过高效的检索模块,用户可以查找到需要的信息,同时对知识的整体结构也有了立体的了解。根据对系统的功能性需求及特色的分析,将系统分为如图1所示的6个模块。
(1)知识点信息资源模块
此模块收集信息,对信息进行科学的整理、分类、存储,将存储在数据库中的信息层次化地展现在客户端页面。
(2)知识点网络模块
此模块在收集信息资源时,建立信息之间的父子或兄弟关系,并将这种关系存储在数据库中,逐步构建知识的网络结构,为用户提供清晰、立体的知识表现形式。
(3)系统搜索引擎模块
利用SQL Server自有的索引功能及Lucene.Net全文检索技术,建立高效的检索系统,通过识别用户输入的检索词,系统地进行模糊或精确查询,找到符合用户要求的相关内容,并进行排序显示。
(4)问答专区模块
此模块实现用户提问、回答、交流的功能,增加了用户间的有效沟通,并使系统的设计更加人性化。
(5)新闻通知模块
此模块用于管理系统新闻和通知,能够实时地将系统动态显示给用户。
(6)用户管理模块
此模块用于对用户的基本信息、权限及知识信息的相关操作进行管理。
根据对上述各个模块的分析,在SQL Server 2005中构建了本系统的数据库Knowledge,数据库中各表之间的关系如图2所示。
本系统采用B/S架构,编程语言为C#,所用技术为.Net平台下的 ASP.NET、Silverlight,后台数据库为 SQL Sever2005。从软件设计上采用三层结构,通常意义上的三层结构就是将整个业务应用划分为:表现层、业务逻辑层、数据访问层。区分层次的目的是为了实现“高内聚,低耦合”。为了展现知识结构的动态网络,本系统还建立了SilverLight应用程序层。具体系统架构如图3所示。
本系统为了保证用户能够高效、准确地搜索到需要的信息,将适用于.Net平台的Lucene.Net全文检索技术和SQL Server索引技术相结合,构建了一个新型的搜索引擎模块。
搜索引擎模块采用多条件检索,知识信息的标题、条目、编辑人、内容都作为检索条件存在。标题、条目、编辑人是作为较短的信息存储在数据库中;而用户编辑的内容则作为一段很长的信息对象存储在数据库中。为了达到比较高效的检索效果,本模块对不同检索条件使用不同的检索技术。
对于标题、条目、编辑人检索条件,通过建立SQL Server数据库的聚集和非聚集索引来实现对它们的快速查找。标题的ID作为主键聚集索引,而编辑人ID作为连接知识表和编辑人表的外键,设定为非聚集索引,条目ID作为条目表的主键聚集索引。这样在建立好索引后,利用查询语句“like%keyword%”对数据库进行查询,效率能够提高50%左右。
对于用户编辑的内容,本文利用Lucene.Net技术,实现全文检索。Lucene.Net是基于Java的全文索引工具包Lucene的.Net移植版本。Lucene不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎及部分文本分析引擎。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以便在目标系统中实现全文检索的功能,或者以此为基础建立起完整的全文检索引擎[5]。
Lucene.Net全文检索模块的架构如图4所示。
Lucene.Net的工作流程如下:
(1)由于是为数据库中的内容建立全文索引,所以建立与数据库的连接。
(2)利用IndexWriter创建索引;IndexWriter是 Lucene.Net的索引器,其主要作用是对索引进行创建,加入Document。其构造函数 IndexWriter(Directory d、Analyzer a、bool create)中的参数分别代表索引路径,使用哪种分词类,是否重建索引[5]。
(3)将需要检索的数据 (本文为数据表中的字段信息)转换为Document的 Field对象,然后将 Document添加到索引文件中;
(4)搜索:利用QueryParser类对查询字符串的解析,将查询关键词转换为搜索用的Query;使用IndexSearcher进行检索;在本系统中用到的是Lucene.Net的多字段检索及多索引目录搜索,多索引目录搜索就是要在多个索引目录中进行比较搜索,类似概念在SQL中就是select*from TableA union select*from TableB。用到的检索语句为:
IndexSearcher[]searchers=new IndexSearcher[2];
searchers[0]=new IndexSearcher(IndexPath0);
searchers[1]=new IndexSearcher(IndexPath1);
MultiSearcher multisearcher=new MultiSearcher(searchers);
(5)检索结果的显示:Hits类取得查询得到的内容。
一般来说网络结构是由N个复杂的树形结构组成,其形状表现为二维或三维网络,如图5为知识网络的抽象图。而为了构建一个立体的知识网络,对各知识点之间的关系设定、树形结构存储、遍历、节点路径等问题的处理显得非常重要。此模块主要负责两个问题:一是为用户提供清晰、立体的知识网络;二是为用户提供一个寻找节点间路径的方法。
2.2.1 树形结构的存储
对于以上两个问题的解决,都涉及到树形结构在关系数据库中存储方式的问题。
树形结构模型为不规则、可变化、有序的,而关系数据库为行列规则模型,是固定不变的、无序的。本文就涉及到父子关系在数据库的存储问题[4]。目前一般有两种方法:分段编码法和利用父指针的任意树法。分段编码法即通过对树节点逐级编码,实现树形结构的存储。这种方法需要预先设置分段的最大值,即树中任意节点的最大子节点数,由于各节点的节点数并不固定或均衡,容易造成内存空间浪费[5]。利用父指针的任意树法,一般采用与表1类似的表结构。这种表结构能够很好地表示树形结构的本质,并且空间利用率很高,对于复杂的树形结构也能适应。因此本文采用此存储方法。
表1 父子树在数据库中的存储
2.2.2 知识网络的构建及节点路径的获取
通过系统后台整理好的知识层次关系,将关键节点的父、子、兄节点进行读取,利用SilverLight技术,通过将节点模块化,动态地构建知识网络图。
对于树形结构节点路径的获取,本系统使用递归寻路径法。递归寻路径法在数据表中只存放父子关系,如表1所示,并没有进行树的多级编码或设置层次列;所以若想取到某一知识点的全路径,需要通过递归函数来获得。
获取某一指定节点路径集的方法类命名为:Get-Path。其内部主要函数的执行逻辑为图6所示。
图6 GetPath类中函数的执行逻辑
此模块实现对知识信息资源的编辑、整理、层次化展现。系统对知识信息的整理,不能简单地以电子百科书的方式简单地罗列,而应根据类别、阶段进行整理。这也正是本系统与维基百科、百度百科这样的电子百科平台的不同。系统对每个知识信息块下分几个学习阶段:基础知识学习阶段、进阶阶段、高级应用阶段。每个阶段又根据实际情况分设不同条目,辅助不同层次的访问者获取知识财富。其基本的层次体系如图7所示。
图7 知识点信息资源层次结构图
本文基于.net平台上的 ASP.Net、SilverLight技术设计实现了一个网络学习系统,对系统中各个模块的功能进行了简要概述。详细分析了系统主要模块的功能实现。在知识网络模块中,系统对于树形结构在关系数据库中的存储,采用了父指针的任意树法,此方法更适用于复杂的网络结构的存储与构建,对于节点路径的获取,系统提出了递归寻路径法,更加准确、快速地实现了节点之间路径的获取;在搜索引擎模块中,对于全文检索的实现,使用了Lucene.Net技术,将Sql的模糊检索改进为Lucene下多条件字段和多索引目录的全文检索,并将Lucene.Net的全文检索技术与SQL Server的索引技术相结合,构建了一个新型的搜索引擎模块,大大提高了检索效率和检索的精确度。
[1]WELSH E T,WANBERG C R,BROWN K G.et al.E-learning:emerging uses,empirical results and future directions[J].International Journal of Training and Development,2003,7(4):245-258.
[2]谭文堂,贺明科,李阜.基于Lucene.Net的分布式全文检索系统[J].计算机应用与软件,2009,26(9):142-145.
[3]丘哲,符滔滔,王学松.开发自己的搜索引擎[M].北京:人民邮电出版社,2010.
[4]姚雄伟,刘莉,邸书灵,等.在数据库上实现一种高效显示的任意树形结构[J].河北省科学院学报,2005,22(4):15-17.
[5]夏明伟,刘星沙.父子结点树的树枝串的形成方法[J].科技咨询导报,2007(13):152-153.