论文总字数:34271字
摘 要
随着自助入网业务规模的不断过大,技术开放平台的技术文档数量和功能入口数量变得越来越庞大,平台的用户进入开放平台的网站时,难免需要在查找某个文档、FAQ时耗费时间,对于有明确目的的访客来说,这会在一定程度上降低用户的生产效率。
为了提高用户检索相关文档和技术的效率,进而提高生产开发速度,本文以中国银联自助入网平台为对象,主要任务是给平台构建一个可以供用户检索需要的API和技术文档等内容的搜索系统。主要的工作包括:一,提取并统一化平台现有的支持性数据内容;二,针对统一化之后的数据,借助Lucene工具包进行索引处理;三,将用户输入的关键词和被检索数据全集进行搜索、打分,返回给用户;四,关联其他站点如技术社区,一次搜索多个站点的内容。
论文从项目背景出发,介绍了全文检索的基本过程,Lucene源码结构和逻辑结构,对比Lucene全文检索和其他全文检索的区别,详细设计了该搜索系统的结构,并给出了关键模块实现过程。
关键词:全文检索;Lucene;索引
Designing and Implementing an Unified Enterprise Searching System Based on Lucene
Abstract:
As the business continues to scale too large,the number of APIs and tech documennts becomes larger,too.When users of platform enter the website, Inevitably need to spend time finding a document, FAQ. For visitors who have a clear purpose, which reduces user productivity to some extent.
In order to improve the efficiency of retrieving related documents and technologies for users,and then improving the efficiency of producing and developing software,this paper take the UnionPay’s Auto-Join Platform as target ojbect,and it’s main task is to build a searching system for retrieving necessary APIs and technical documents and other contents for users.Main process contains as follows: Firstly,extract and unite those data stored on the platform;Secondly,aiming at those data united by step 1,indexing the data by toolkit provided by Lucene;Thirdly,execute searching and scoring between keywords input by users and whole set of retrieved data,then return the result to users;At last,connecting other site,such as technical community,completing the aim of searching multiple sites at once.
This paper starts from the background of project, then firstly introduced the general process of full-text search,Lucene source code structure and logic structure,compared the differences between Lucene full-text search and other full-text search,designed the structure of this searching system in detail,and then provide the implemention process of some key modules.
Keywords:Full-text Retrieving;Lucene;Indexing
目录
第一章 绪论 1
1.1 引言 1
1.2 全文检索技术发展现状 2
1.3 构建统一搜索系统需要考虑的问题以及采用的手段、方法 4
1.4 本文的研究目的和主要研究内容 6
第二章 应用到的技术及原理 7
2.1 Lucene介绍 7
2.1.1 Lucene的总体架构: 7
2.1.2索引和搜索过程 8
2.1.3 Lucene的主要模块介绍 10
2.1.4 Lucene的索引 10
2.1.6 Lucene计算文档和查询语句的相关性 12
2.2中文分词技术(中文分词原理) 15
2.2.1 分词的意义 15
2.2.2 IKAnalyzer分词原理 15
第三章 系统设计 19
3.1系统整体架构 19
3.2 跨站搜索设计 21
3.3 权限控制设计 22
3.4 系统接口设计 23
3.4.1 搜索模块相关数据模型说明 23
3.4.2 索引模块接口 27
第四章 系统实现 30
4.1 Web模块 30
4.1.1 配置文件 30
4.1.2 前端页面实现 32
4.1.3 控制器实现 35
4.2 搜索服务模块 36
4.2.1 maven配置文件 36
4.2.2 服务实现 38
4.3 索引管理模块 42
4.3.1 配置文件 42
4.3.2 创建索引 43
4.3.3 查询索引记录 45
4.3.4 索引缓存/内存索引 46
4.4 原始数据处理模块 47
4.4.1 generate.sh脚本 47
4.4.2 createIndex.sh脚本 49
第五章 总结和展望 51
5.1 总结 51
5.2 工作展望 51
第一章 绪论
1.1 引言
技术开放平台的主要作用就是提供应用程序接口、技术文档供开发人员使用,平台的存在将技术规范化,大大提高了生产效率。而银联的自助入网平台不仅提供了入网需要的各种必要应用程序接口、技术文档,并且将以前签约等复杂的手续流程省去,商家和机构可以直接跳过签约这一步,先在平台上进行入网测试,然后再决定是否签约。这无疑为更多商家和机构提供了试用银联结算交易技术并进一步接入银联的机会,有助于银联业务的顺利推广。
然而,随着业务规模的不断过大,技术开放平台的技术文档数量和功能入口数量变得越来越庞大,平台的用户进入开放平台的网站时,难免需要在查找某个文档、FAQ时耗费时间,对于有明确目的的访客来说,这会在一定程度上降低用户的生产效率。
解决思路无非两种:一是不断改进网站界面,使功能结构更加清晰明了,但是这种方法随着网站内容的增加效果也会下降,网站维护的成本也会不断上升,因为对应的后端接口也需要同时改造,因此并非长远之计;另一种方法就是提供搜索入口,提供全文检索功能,全文检索是以计算机数据如文本等为处理对象,提供按照文档资料的内容而非外在特征来实现的信息检索手段。针对文档的内容创建一系列索引,能够帮助人们方便、快速查找到信息。Lucene是目前比较流行的全文检索工具包,已经在许多搜索项目中得到了广泛的应用。
本文将介绍Lucene全文检索的基本原理,利用Lucene设计并实现针对企业技术开放平台的统一搜索系统。系统针对官方开放平台、技术论坛,搜索可以跨两站同时进行,尽可能返回更多对用户有用的信息。
1.2 全文检索技术发展现状
网络飞速发展,数据存储技术不断完善,储存大量信息已经不再是难题,人们关心的重点是如何在这些信息中快速、准确地找到有用信息。
信息检索的核心技术是全文检索技术,全文检索是以各种各种数据诸如文字、声音、图像等为检索对象,提供按照文字的内容实现的信息检索手段,而非数据的外在构建结构。
网络上的数据分为总体两种类型,结构化数据和非结构化数据。结构化数据是指具有固定格式或有限长度的数据,如数据库,元数据等;而非结构化数据是指不定长或无固定格式的数据,如邮件,word文档等。某些场合,还会提到半结构化数据的概念,如XML,HTML等。根据不同的应用场景,可以按照结构化数据来处理,也可以抽取出纯文本按照非结构化数据处理。非结构话数据又叫全文数据。
根据数据搜索的分类,也可以被分类成结构化数据搜索和非结构化数据搜索。结构化数据搜索顾名思义,如对数据库的搜索,使用SQL语句;非结构化数据搜索,如Linux系统中的grep命令,再入更常见的搜索引擎。在此我们重点讨论非结构化数据搜索,即全文检索。
全文检索有两种主要方法:其一是顺序扫描法(Serial Scanning):所谓顺序扫描,即要查找包含某字符串的文件,那么从头开始扫描已有文件,每个文档一行一行扫描,如果匹配到这个字符串,那这个文件就是目标文件,如此往复直到遍历全部文件。另外一种是从非结构化数据中提取出来一部分信息,重新组织成具有一定结构的数据,然后对此进行搜索,从而达到加快搜索速度的目的,这个过程叫做全文检索(Full-text Search)。
目前的全文检索技术大致分为两个过程,索引创建(Indexing)和搜索索引(Search)。索引创建就是从数据源中提取信息,创建索引的过程。搜索索引指得到用户的查询请求,搜索创建的索引,然后返回搜索结果的过程。
非结构化数据中所存储的信息是从文件到字符串的映射,即某文件包含某字符串。而搜索的过程是找出包含目标字符串的文件,就是从字符串到文件的映射。于是如果将从字符串到文件的映射保存下来,则会大幅度提高搜索的效率。因为从字符串到文档的映射和文档到字符串映射是两个相反的关系,我们将保存这种映射关系的数据结构称为反向索引。
反向索引其实是包含词典和倒排表的数据结构。词典就是出现在文档中的词语或短语的集合,即一些列字符串;倒排表是每个节点都指向包含节点内容的文档链表。
全文检索的索引创建一般有如下过程:
1 获取要索引的源文档(Document)。在此举两个简单文件的例子:
文件A
Students should be allowed to go out with their friends, but not allowed to drink beer.
文件B
My friend Jerry went to school to see his students but found them drunk which is not allowed.
2 将文档分词(Tokenizer)
分词的工具会将文档分成多个独立的单词,同时将标点符号去除,去除停止词(Stop word)。停止词是几乎每种语言都有的的一类特殊词语,不具有具体意义,比如汉语的“的”、“了”等,这些词语通常不构成搜索关键词,因而这种词会在索引创建时会被自动去掉。英语中挺词(Stop word)如:“the”,“a”,“this”等。对于每一种语言的分词组件(Tokenizer),都有一个停止词(stop word)词典。文档经过分词(Tokenizer)后,产生一系列词元(Token)。在我们的例子中,便得到以下词元(Token):{Students,allowed,go,their,friends,allowed,drink,beer,My,friend,Jerry,went,school,see,his,students,found,them,drunk,allowed}
3 语言处理器(Linguistic Processor)处理词元(Token)
语言处理器(linguistic processor)主要将词元(Token)做一些同语言相关的处理。对于英语,语言处理组件一般将所有词汇变为小写,即stemming;把单词转为词根,即lemmatization。这个过程的处理结果称为词(Term)。在此例中,得到的词如下:“student”,“allow”,“go”,“their”,“friend”,“allow”,“drink”,“beer”,“my”,“friend”,“jerry”,“go”,“school”,“see”,“his”,“student”,“find”,“them”,“drink”,“allow”。
4索引组件(Indexer)处理语言处理器得到的词
索引组件利用得到的词创建一个字典,对字典按照首字母顺序进行排序,最后合并相同的词成文文档倒排链表。在此倒排链表中,有几个定义:Document Frequency 即文档频次,表示总共有多少文件包含此词;Frequency 即词频率,表示此文件中包含了几个此词。
然后是搜索过程,搜索主要分为以下过程:
1 用户输入查询语句。
2 对查询语句进行词法分析、语法分析以及语言处理。词法分析主要切分语句,提取单词以及关键字,语法分析的目的是生成语法树,语言处理同索引过程中的语言处理。
3 搜索索引,查找与语法树相符的文档。首先,从反向索引表找到包含关键词的文档链表;其次,对包含关键词的链表进行运算(并、或、差操作);最终得到我们需要的文档链表。
4 根据查询语句和步骤3中得到文档链表中文档的相关性打分,对链表排序
5 包装并返回查询结果给用户
以上就是全文检索目前比较成熟的解决方案。可以看出,在构建全文检索系统的过程中,比较重要的是索引的建立(其中包括文档的分词)以及搜索时文档相关性计算,因为这两点直接关系到了搜索的效率和准确性,这两点在后文正文中还会作详细介绍。
1.3 构建统一搜索系统需要考虑的问题以及采用的手段、方法
项目的总体工作目标:
本项目针对公司的实际业务需求,为提高生产效率,更好地推广公司业务,方便用户使用自助入网平台,将设计并实现一个搜索接口。该模块将嵌入自助入网平台,并且在搜索范围上联接开放平台和技术社区,扩大搜索的范围。同时尝试在实现功能的基础上进行优化,并对将应用向改造分布式系统的方法进行探索和尝试。
通过对目前全文检索技术的评述,在设计针对银联自助入网平台的搜索系统时,需要考虑的主要有一下几点:如何将源数据(文档、网页)处理成适合构建索引的非结构型数据,并方便地完成字符串到文件的映射(倒排);如何针对不同类型的数据建立索引并存储;如何将两个乃至多个网站的数据索引维护在同一逻辑空间内,便于跨站搜索;如何设计用户的搜索权限,使得系统仅向用户展示其有权限查看的文档;如何优化索引的读取速度以缩短搜索的响应时间。
a 将源数据(文档、网页)处理成适合构建索引的非结构型数据,并方便地完成字符串到文件的映射(倒排)
为解决这个问题,根据网站中数据的特点,采用了Shell脚本处理数据库中的文本数据,将其分类并过滤掉HTML/JS标签,各自导成纯文本文件,文本文件的名称格式为“类型_文档id_权限码”,将其存储在相应类型的路径下;采用Java的类库处理富文本文件(word/pdf/excel等),将纯文本提取出来,忽略样式等无关内容,也导成纯文本文件,以相同的命名格式保存到对应路径下。
b 针对不同类型的数据建立索引并存储
使用基于Java实现的Lucene工具包,单独建立一个工程,对上一步处理过的数据源进行在再加工:每个文件有文件名、文件内容两种要素,其中文件名又包括文档类型、文档id、文档权限码三个子要素。在建立索引时,将文件名作为一个域,再对文件内容中的每一行创建域,这样就求保证了文档的内容作为索引的一部分;最后Lucene的类IndexWriter将索引写入磁盘。这个创建索引的工程被打包成jar包,由shell脚本调用执行。
c 将两个乃至多个网站的数据索引维护在同一逻辑空间内,便于跨站搜索
其他内部站点的索引生成方法类似于上文,主站中的shell脚本会定时调用一个独立的程序从其他需要检索的站点的约定路径下载索引文件到本机的约定路径,供搜索系统使用。
d 设计用户的搜索权限,使得系统仅向用户展示其有权限查看的文档
设计了一套权限规则和权限码,在第一步处理中将权限码附加到处理后的文件上,在搜素时获取当前登录用户的权限码,与检索出的文档比对,判断是否具有查看的权限。权限设计将在正文中详细阐述。
e优化索引的读取速度以缩短搜索的响应时间
剩余内容已隐藏,请支付后下载全文,论文总字数:34271字
该课题毕业论文、开题报告、外文翻译、程序设计、图纸设计等资料可联系客服协助查找;