论文部分内容阅读
摘 要:针对工建设领域信息公开系统信息检索的需求,在Lucene的基础上,设计并实现了近实时的全文检索系统,核心模块包括语言处理模块、索引管理模块和检索模块。通过研究Lucene的内部原理,对中文分词IKAnalyser扩展同义词。
关键词:Lucene;全文检索;近实时
中图分类号:TP391.3;TP393.092
近年来,政府积极增加工程建设领域信息公开透明度。在工程建设领域项目信息和信用信息公开共享系统中,可以获得任一项目信息和信用信息。面对巨大的信息,为用户提供快速准确的检索到所需有效信息的方法非常必要。
目前,常见的大型搜索引擎[1]有Google,Baidu,Yahoo等,但这种搜索引擎并不适应于中小型的站内搜索。传统数据库的索引的更新会导致大量的I/O操作,且不能索引附件,而由Doug Cutting设计开发的开源搜索引擎Lucene的目标是为各种中小型应用程序加入全文检索功能,Lucene不是一个完整的全文索引应用,而是一个引擎工具包,它可以方便的嵌入到各种应用中实现针对应用的全文检索功能。
1 开源全文检索引擎Lucene
Lucene是一个高效可扩展的全文检索库,用Java实现,无须配置, 仅支持纯文本文件的索引和搜索,不负责由其他格式的文件抽取纯文本文件,或从网络中抓取文件的过程。
Lucene源码中共包括7个模块[2],其中主要的有analysis模块主要负责词法分析及语言处理而形成Term;index模块主要负责索引的创建;store模块主要负责索引的读写;QueryParser主要负责语法分析;search模块主要负责对索引的搜索;similarity模块主要负责对相关性打分的实现。
Lucene有索引和检索的两个过程,包含索引创建,索引,检索三个要点。
2 系统设计与实现
系统采用B/S三层架构,开发框架采用SSH框架,开发工具是Myeclipse 6.0,Tomcat 5.5和SQL Server 2005。系统核心模块包括语言处理模块、索引管理模块和检索模块。
2.1 语言处理模块
Lucene的检索过程是将输入的关键词与已建好的索引匹配,索引使文章的关键词与文章建立了对应关系,而分词器就是用于切分文章得到关键词的工具。
Lucene分词的流程为:
由Reader读入数据流,Tokenizer 将数据流转换为语汇单元,TokenFilter对语汇单元进行过滤操作,最后得到TokenStream。
Lucene并未提供很好的中文分词,本系统采用第三方分词器IKAnalyser[3],并对其扩展同义词查询。同义词词库以.dic文件保存,每行两个词以逗号隔开,将.dic文件按行读入后以map(key,value)形式存放。利用map.get(String token)检查tokenStream中词元是否有同义词,如果有则存入栈内,保存当前词元的信息,清空保存词元的变量CharTermAttribute,将同义词加入其中,同时将词与词的位置增量设为0,即setPositionIncrement(0),从而实现将同义词加入到tokenStream中。
2.2 索引管理模块
该模块实现索引建立和索引的管理。提供更新、删除、添加和重构索引的功能。重构索引是对索引进行删除和重新建立并提供手动和定时执行两种方式。
用户总希望实时检索到更新后的信息,即数据发生变化后,需由writer.commit()提交索引写入硬盘,但该函数会随着索引的增加效率越来越低。Lucene提供的近实时检索是由NRTManager来管理一切,当更新数据后,先将索引保存到内存,在某个时间提交内存中索引,写入硬盘,检索时直接检索内存。NRTManager的getSearcherManager(true)方法获取线程安全的SearcherManager来管理IndexSearcher,当索引更新时,需要重新获取IndexSearcher,SearcherManager每隔一小段时间执行maybereopen()重新读取已更新的索引,从而实现了近实时的全文检索。
图1是建立索引的流程图,IndexField存储建立索引的字段,field2doc()实现将IndexField转换为Lucene可处理类型Document,TempIndex记录暂存于内存中还未写入硬盘的索引,以免发生意外,导致信息不一致。
2.3 检索模块
由语言处理模块对用户输入的关键词进行处理得到一系列term,将索引读入内存,通过检索模块检索,得到每个term的文档链表,对文档链表进行交、差操作,得到结果文档,而后按相关度和时间排序并向用户分页显示查询结果。
图2是检索流程图,scoreAfter(ScoreDoc scoreDoc,Query query,int viewNum)实现分页显示,scoreDoc获得当前页的第一条结果,query实现多字段查询,viewNum是页面显示结果条数。Index封装jsp页面要显示的字段,标题title、内容摘要content、发布人creatorName、发布单位chushiName、发布时间createTime、类型type。
3 总结
本文采用Lucene技术结合实际需求,实现了基于Lucene的全文检索系统,主要模块包括语言处理模块、索引管理模块和检索模块。本文不足之处是,限于实际硬件条件和数据量,本系统还需要进行优化。
参考文献:
[1]张蕾.基于Lucene的站内电子档案检索系统设计与实现[J].软件导刊,2012,4.
[2]劳志佳.J基于Lucene 3.5搜索技术的研究与实现[J].现代计算机,2012,2.
[3]义天鹏,陈启安.基于Lucene的中文分析器分词性能比较研究[J].计算机工程,2012,11.
作者简介:李丽枝(1987.5.17-),女,河北省无极县人,硕士研究生,研究方向:数据库理论与信息系统。
作者单位:沈阳理工大学,沈阳 110168;辽宁省信息中心,沈阳 110002
关键词:Lucene;全文检索;近实时
中图分类号:TP391.3;TP393.092
近年来,政府积极增加工程建设领域信息公开透明度。在工程建设领域项目信息和信用信息公开共享系统中,可以获得任一项目信息和信用信息。面对巨大的信息,为用户提供快速准确的检索到所需有效信息的方法非常必要。
目前,常见的大型搜索引擎[1]有Google,Baidu,Yahoo等,但这种搜索引擎并不适应于中小型的站内搜索。传统数据库的索引的更新会导致大量的I/O操作,且不能索引附件,而由Doug Cutting设计开发的开源搜索引擎Lucene的目标是为各种中小型应用程序加入全文检索功能,Lucene不是一个完整的全文索引应用,而是一个引擎工具包,它可以方便的嵌入到各种应用中实现针对应用的全文检索功能。
1 开源全文检索引擎Lucene
Lucene是一个高效可扩展的全文检索库,用Java实现,无须配置, 仅支持纯文本文件的索引和搜索,不负责由其他格式的文件抽取纯文本文件,或从网络中抓取文件的过程。
Lucene源码中共包括7个模块[2],其中主要的有analysis模块主要负责词法分析及语言处理而形成Term;index模块主要负责索引的创建;store模块主要负责索引的读写;QueryParser主要负责语法分析;search模块主要负责对索引的搜索;similarity模块主要负责对相关性打分的实现。
Lucene有索引和检索的两个过程,包含索引创建,索引,检索三个要点。
2 系统设计与实现
系统采用B/S三层架构,开发框架采用SSH框架,开发工具是Myeclipse 6.0,Tomcat 5.5和SQL Server 2005。系统核心模块包括语言处理模块、索引管理模块和检索模块。
2.1 语言处理模块
Lucene的检索过程是将输入的关键词与已建好的索引匹配,索引使文章的关键词与文章建立了对应关系,而分词器就是用于切分文章得到关键词的工具。
Lucene分词的流程为:
由Reader读入数据流,Tokenizer 将数据流转换为语汇单元,TokenFilter对语汇单元进行过滤操作,最后得到TokenStream。
Lucene并未提供很好的中文分词,本系统采用第三方分词器IKAnalyser[3],并对其扩展同义词查询。同义词词库以.dic文件保存,每行两个词以逗号隔开,将.dic文件按行读入后以map(key,value)形式存放。利用map.get(String token)检查tokenStream中词元是否有同义词,如果有则存入栈内,保存当前词元的信息,清空保存词元的变量CharTermAttribute,将同义词加入其中,同时将词与词的位置增量设为0,即setPositionIncrement(0),从而实现将同义词加入到tokenStream中。
2.2 索引管理模块
该模块实现索引建立和索引的管理。提供更新、删除、添加和重构索引的功能。重构索引是对索引进行删除和重新建立并提供手动和定时执行两种方式。
用户总希望实时检索到更新后的信息,即数据发生变化后,需由writer.commit()提交索引写入硬盘,但该函数会随着索引的增加效率越来越低。Lucene提供的近实时检索是由NRTManager来管理一切,当更新数据后,先将索引保存到内存,在某个时间提交内存中索引,写入硬盘,检索时直接检索内存。NRTManager的getSearcherManager(true)方法获取线程安全的SearcherManager来管理IndexSearcher,当索引更新时,需要重新获取IndexSearcher,SearcherManager每隔一小段时间执行maybereopen()重新读取已更新的索引,从而实现了近实时的全文检索。
图1是建立索引的流程图,IndexField存储建立索引的字段,field2doc()实现将IndexField转换为Lucene可处理类型Document,TempIndex记录暂存于内存中还未写入硬盘的索引,以免发生意外,导致信息不一致。
2.3 检索模块
由语言处理模块对用户输入的关键词进行处理得到一系列term,将索引读入内存,通过检索模块检索,得到每个term的文档链表,对文档链表进行交、差操作,得到结果文档,而后按相关度和时间排序并向用户分页显示查询结果。
图2是检索流程图,scoreAfter(ScoreDoc scoreDoc,Query query,int viewNum)实现分页显示,scoreDoc获得当前页的第一条结果,query实现多字段查询,viewNum是页面显示结果条数。Index封装jsp页面要显示的字段,标题title、内容摘要content、发布人creatorName、发布单位chushiName、发布时间createTime、类型type。
3 总结
本文采用Lucene技术结合实际需求,实现了基于Lucene的全文检索系统,主要模块包括语言处理模块、索引管理模块和检索模块。本文不足之处是,限于实际硬件条件和数据量,本系统还需要进行优化。
参考文献:
[1]张蕾.基于Lucene的站内电子档案检索系统设计与实现[J].软件导刊,2012,4.
[2]劳志佳.J基于Lucene 3.5搜索技术的研究与实现[J].现代计算机,2012,2.
[3]义天鹏,陈启安.基于Lucene的中文分析器分词性能比较研究[J].计算机工程,2012,11.
作者简介:李丽枝(1987.5.17-),女,河北省无极县人,硕士研究生,研究方向:数据库理论与信息系统。
作者单位:沈阳理工大学,沈阳 110168;辽宁省信息中心,沈阳 110002