Lucene搜索

2024-09-20

Lucene搜索(共7篇)

Lucene搜索 篇1

1. 引言

自从有了计算机以后, 人类开始用计算机保存信息, 有保存就需要查找, 于是出现了检索技术。文本检索技术的发展从最初的SMART文档检索系统到AltaVista搜索引擎, 到现在的搜索巨头Google, 人们习惯在互联网上搜索需要的信息。同时在同一个网站内往往拥有大量的资源, 怎样在网站内部使用户能够迅速的找到所需信息, 已成为一个网站能够吸引用户的重要方面, 建立站内搜索引擎成为必要。使用Lucene实现站内搜索比较与传统的使用数据库查询, 使用Google提供的站内搜索存在优势。

2. 国内外现状分析

在如今的网站建设中, 建立站内的全文检索有重要的意义。使用Lucene而不用直接从数据库里搜索记录, 主要是基于以下原因:

(1) 性能问题, Lucene是基于文件索引的搜索机制, 性能要比数据库里检索更快, 特别是数据量大的时候两者区别比较明显。

(2) 目前很多网站, 都已经将页面静态化, 这种情况下, 直接用生成的文件编制索引, 再利用Lucene来检索, 可以不用查询数据库, 减轻了数据库的压力。

(3) Lucene可以更方便的进行分词, 支持多个关键字检查等操作, 在实现上要比数据库查询方便。

虽然大型搜索引擎的功能已经越来越强大了, 国内外很多站点都使用了Google的站内检索代替了自己的站内数据库全文检索。但依靠Google这样的大型搜索引擎做站内检索会有以下弊端:

(1) 数量有限:搜索引擎并不会深度遍历一个网站而将网站所有的内容都索引进去, 例如Google更容易索引静态网页且是最新更新的。基于Lucene的站内搜索, 可以索引所有需要的内容。

(2) 更新慢:搜索引擎针对站点的更新频率也是有一定周期的, 很多内容需要一定时间后才能进入GOOGLE的索引。基于Lucene的站内搜索, 可以及时更新和删除索引。

(3) 内容不精确:搜索引擎需要通过页面内容提取技术将导航条, 页头页尾等内容过滤掉, 这种摘要和排重机制是很难实现的。基于Lucene的站内搜索, 因为对网站内容添加维护的同时进行索引添加, 维护可以保证内容的精确程度。

(4) 无法控制输出:当有更多的输出需求, 例如按时间排序, 按点击量, 按类目过滤等, 则不够灵活。基于Lucene的站内搜索, 使用Lucene的API可以按照实际需要对结果进行分析, 排序。

3. Lucene框架

Apache Lucene是一个基于Java全文搜索引擎, 提供一组解读, 过滤, 分析文件, 编排和使用索引的API。使用Lucene建立站内搜索可以方便用户查找信息, 并且基于Lucene的全文检索便于索引添加, 维护, 搜索, 并能对搜索结果进行分析, 排序。图1列出了Lucene的系统结构与源码组织图。

从图1中看到, Lucene的系统由基础结构封装、索引核心、对外接口三大部分组成。其中直接操作索引文件的索引核心又是系统的重点。Lucene将所有源码分为了7个模块, 并分别放在七个包中, 分别是:analysis, document, index, queryParser, search, store, util。以下分四个部分对Lucene框架的使用进行阐述。

(1) 建立索引

Lucene提供了非常简单的建立索引的方法, 只要能将要索引的文件转化为文本格式, Lucene就能为这些文档建立索引, 建立索引的过程分为以下三个步骤。

第一步:将不同的数据源组织成一个Document类型的对象。

第二步:对要建立索引的数据对象进行分析。

第三步:按照Lucene的索引格式将数据写入索引文件。

Lucene提供了五个基础的类来实现这些步骤, 分别是Document, Field, IndexWriter, Analyzer, Directory。

(2) 搜索

建立好索引后, 就可以根据索引进行搜索。利用Lucene进行搜索, 搜索引擎首先会对搜索的关键词进行解析, 然后再在建立好的索引上面进行查找, 最终返回和用户输入的关键词相关联的文档。搜索的过程可以通过三个步骤来实现。

第一步:初始化检索工具IndexSearcher, 设置索引存放的路径。

第二步:构建一个Query对象, 对查询关键字进行分析。

第三步:搜索并处理返回的结果。

Lucene提供了五个基础的类来完成这个过程, 它们分别是Query, Term, TermQuery, IndexSearcher, Hits。

(3) 结果排序与文档评分机制

对于检索到的结果, 需要按一定的顺序返回给用户。因此, 需要引入一种机制来对检索结果进行排序, 以便更加合理地将结果返回给用户。评分机制就是对检索结果按某种标准进行评估, 然后按分值的高低来对结果进行排序。Lucene根据内置算法对文档进行评分, 另外Lucene在公式中还加入了加权因子, 它可以实现有效地对某个查询或某一域给评分带来的影响施加控制, 从而改变某一文档的评分, 并最终改变在结果中的排序。

(4) 分词

对于一个工作良好的搜索引擎来说, 分词是必不可少的一个核心模块, 只有通过分词才可能让信息检索系统理解用户的检索请求, 进而为其搜索相关的内容。此外, 分词的质量将直接决定搜索引擎的搜索精度, 分词的速度也将影响搜索的速度。Lucene提供了分词器, 称为Tokenizer, 和过滤器, 被称为TokenFilter。但是这些分词器和过滤器都只适用于使用英文26个字母组成的语言。对于中文分词, 可以利用Lucene的扩展性, 将第三方分词工具集成到Lucene中实现中文分词。

4. 结束语

随着网站内容的越来越丰富, 信息量也越来越大的情况下, 访问者想要得到他们的信息, 站内搜索的作用就会明显起来。Lucene开源框架提供了全文检索功能, 利用中文分词的第三方分词工具, 可以很好的实现站内搜索, 方便用户使用, 体现网站专业性, 提高网站竞争力。

参考文献

[1]李晓明, 闫宏飞, 王继民.搜索引擎——原理、技术与系统[M].北京:科学出版社, 2004.

[2]车东.Lucene:基于Java的全文检索引擎简介[OL].[2008-11-24].http://www.chedong.com/tech/lucene.html.

[3]邱哲.开发自己的搜索引擎--LUCENE 2.0+HERITRIX[M].北京:人民邮电出版社, 2007.

Lucene搜索 篇2

21世纪是网络信息化的时代, 网络信息已经成为人们工作与学习中不可或缺的东西。网络在世界范围内向用户提供信息服务及其所拥有的信息资源, 但随着网络的蓬勃发展, 信息数量的快速增长, 当今网络上的这些海量信息形态各异, 且分散在网络中的各个角落。因此, 如何从网络上的海量信息中检索出用户所需要的信息, 成为了我们关注的一个重要问题。目前, 虽然有了像Google、百度这样的通用搜索引擎, 但是它们并不能适合人们所有的情况和需要, 也没有哪个最大最好的搜索引擎可以覆盖所有的搜索范围, 因为不同的人群范围所需求的信息资源也是不尽相同的。人们习惯在互联网上查找信息, 往往在同一个网站内拥有丰富的信息资源, 如何在网站内部快速查找用户所要的信息, 也成为了人们当前关注的一个焦点。

二、搜索引擎

搜索引擎是一个为用户提供信息检索功能的网络工具。搜索引擎是随着互联网络信息的快速增长, 开始逐步发展起来的技术。在互联网发展的最初阶段, 网站的数量相对较少, 信息查找比较容易。但随着互联网技术爆炸性的发展, 网络上面的信息越来越多, 并且以各种各样的形态存在, 这时用户便很难找到所需要的信息, 一些为满足大众信息检索需求的专业搜索网站就应运而出了。如今, Google的巨大成功让整个世界都把眼光投入到搜索引擎这个领域中, 并且Google在一定程度上起到了引导作用。Google公司在2007年决定向小型网站提供专门的搜索服务。这些都表明小型专用的搜索引擎将在人们获取互联网信息中发挥着想当重要的作用。

三、l ucene

Lucene是Apache软件基金会Jakarta项目组的子项目, 它是一个开放源码的全文检索工具。Lucene在起初是基于Java开发的, 在网站建设中扮演的是一个全文索引工具的角色。与传统的直接从数据库中搜索记录相比较, 使用Lucene可以大大增加搜索引擎的性能。Lucene的搜索机制是基于文件索引的, 所以性能要比从数据库中检索更快, 尤其当数据量大的时候区别更加明显。Lucene可以及时索引所有需要的内容, 并更新和删除它们。

Lucene的系统结构具有良好的二次开发性能。首先它的索引格式与平台无关, 其次它将各个组成部分封装成抽象类, 具体的实现定义为抽象类的实现过程, 并且具有强烈的面向对象的特征。 (图1)

四、校园网的搜索引擎框架

现代网络信息化水平迅速提高, 校园网作为一个信息核心领域, 所涉及到的内容也是形态各异的。本文就如何搭建一个校园网内的搜索引擎, 以方便在校师生快速准确地查找各自所需信息的整体流程, 给出详细的介绍。搜索引擎首先根据网站的需求选择合适的网络爬虫, 对网络上的信息进行爬取, 爬取到信息之后, 对其中的有用信息进行提取, 并利用Lucene对所提取到的有用信息进行索引, 最终输出与用户查询结果匹配度最大的信息。

本文研究的校园网搜索引擎有三个功能模块:信息采集模块、信息处理模块和信息检索模块。信息采集模块, 顾名思义, 就是对网络上的信息进行采集, 这是整个搜索引擎系统一项最初始的准备工作, 也是最基础的工作。该搜索系统针对的目标群体主要是在校师生, 也就是说, 要捕获的信息主要来源于校园网络。信息处理模块, 主要负责对采集到的信息进行提取, 提取到所需的有价值的信息之后并为其建立索引, 为后续的信息检索模块构建好索引数据库。信息检索模块主要负责在已构建好的索引数据库中查找包含用户查询关键字在内的文本内容, 并负责用户从搜索界面接收关键字以及查询结果信息的返回工作。校园网的搜索引擎系统组织结构图如图2所示。 (图2)

(一) 信息采集模块。

信息采集模块是校园网搜索系统最基础的组成部分, 它的作用是对指定网站的页面信息进行采集, 并将采集到的信息保存到数据库中。这一部分主要依靠网络爬虫程序来实现。网络爬虫是一个自动获取网页内容的程序, 它为搜索引擎从Internet网上下载网页, 是搜索引擎的重要组成部分。它从一个或一组初始网页的URL开始, 获取初始网页上的URL, 在抓取网页的过程中, 不断从当前页面上抽取新的URL放入队列, 直到满足系统的一定停止条件。本文利用网络爬虫从校园网上抓取网页URL、网页标题和网页文本内容, 并保存到已构建好的本地页面数据库中。信息处理模块从页面数据库中读取页面信息, 分析信息内容并为其建立索引。

一个好的网页爬虫应该具有很好的灵活性和健壮性, 并且易于管理员操作管理。灵活性旨在爬虫能够尽可能多的适用于各种不同的场合。健壮性则要求爬虫在面对各种奇怪的规则或者链接时具有很好的处理策略, 以保证系统能够正常运作。人性化管理界面是爬虫网络是否受欢迎的一个重要评判标准, 越简单清晰越高效的管理系统会更加受到人们的欢迎。

(二) 信息处理模块。

Lucene开源检索框架是基于文件索引机制的, 只能对文本文件进行索引。信息处理模块主要包含3个步骤:读取页面内容、页面内容解析和构建索引。结构图如3所示。 (图3)

1、读取页面内容。

首先, 该模块从已构建好的页面数据库中提取网页标题和网页文本内容;然后将提取到的信息传递给下一步骤处理。

2、页面内容解析。

读取到从页面数据库传送过来的文本内容之后, 就要对其进行解析处理了。解析就是对文本内容进行解释和分析。分析在Lucene中是指将文本转换为最基本的索引项的一个过程。所谓的分析器就是对分析操作的封装类。对于不同的语言, 分析器所要完成的功能是不一样的。比如, 对英语来说, 要将文档字母从大写转换成小写、过滤忽略词等。校园网搜索引擎面对的语言主要是中文, 分析器需要实现的就是对完整的语句进行分词。分词, 顾名思义, 就是将一段文本拆分成多个词。在建立索引的时候, 写入索引库中并能够被用户检索的是一个个的词条。所谓词条就是通过分析器进行分词和相关处理后的文本单元项, 只有通过分词才可能让搜索系统理解用户的检索请求, 进而为其搜索相关的内容。

对于一个工作性能良好的搜索引擎来说, 分词是必不可少的一个核心模块。分词的质量将直接决定搜索引擎的搜索精度, 分词的速度也将影响搜索的速度。所以, 选择一个合适的分词器对整个系统的性能是至关重要的。JE分词, 这是Lucene中自带的工具之一, 可以很好地完成系统的分词工作。JE分词的下载地址为http://www.jesoft.cn/, 这是一套由java写成的分析软件。

3、构建索引。

事实上, 常用的索引方式有3种, 分别是倒排索引、后缀数组索引和签名文档索引。

Lucene采用的是倒排索引结构。倒排索引非常符合人们的思维习惯, 同时它对关键字检索特别有效。倒排是一种面向单词项的索引机制。通常, 由词项 (关键字) 和出现情况两部分组成。对于索引中的每个词项 (关键字) , 都跟随一个列表 (位置表) , 用来跟踪记录单词在所有文档中出现过的位置。

Lucene中涉及两个非常重要的概念, 分别是Document和Field。Document, 解释为文档, 在Lucene中, 它代表一种逻辑文件。Lucene本身无法对物理文件建立索引, 而只能识别并处理Document类型的文件。Document作为一种数据源的集合, Lucene会从其中取出相关的数据源内容, 并根据属性配置进行相应的处理。Field, 我们可以理解为字段, 在Lucene中, 是用Field来表示一个一个的Document数据源的。在用户构建完Document、并为其添加如合适的Field后, 便可以按照Lucene的索引格式将数据写入索引文件, 构成索引文件库。

(三) 用户检索模块。

在建立好索引库之后, 用户就可以根据索引进行检索了。在Lucene中, 搜索引擎在接收到用户检索关键字后, 首先会对关键字进行分析, 然后在已建立好的索引库中进行搜索, 搜索完毕后, 将与关键字最相关的内容返回给用户。搜索的具体步骤如下:

第一步:初始化检索工具IndexSearcher, 设置索引存放路径。

IndexSearcher searcher=new IndexSearcher (INDEX_STORE_PATH) ;

第二步:构建一个Query对象。

Term t=new Term (”a”, ”b”) ;

Query q=new Query (t) ;

其总a是Document文档, b是用户要检索的关键字。

第三步:检索并返回查询结果。

执行完这三个步骤, 用户将会得到所输入关键字的相关结果。

五、结束语

本文对校园网的搜索引擎框架做了一个整体的介绍。现代网络信息以多样化的形式快速增长, 互联网用户想要得到自己所需要的信息, 搜索引擎起着至关重要的作用。当代社会分工不同, 人们所关注的信息产业范围也不尽相同, 所需要的信息也越发的呈现出模块化, 分属于不同的站。站内搜索将越来越受到人们的关注, 具有很好的研究价值和前景。

摘要:现代网络信息化水平日益提高, 网页信息量急剧增加, 搜索引擎已经成为人们获取所需知识的必要工具之一。本文结合校园网搜索引擎的具体需求, 介绍校园网搜索引擎的整体框架。其中, l ucene作为开源的检索框架, 具有很好的应用性。

关键词:搜索引擎,lucene,网络爬虫,站内搜索

参考文献

[1]车东.Lucene:基于Java的全文检索引擎简介[OL].[2008-11-24].http://www.chedong.com/tech/lucene.html.

[2]薛宇星.基于Heritrix和Lucene的Web站内搜索系统[D].西安:西安电子科技大学, 2008.

[3]Lucene中国[EB/OL].http://www.lucene.com.cn, 2010.5.27.

[4]冯斌.基于Lucene小型搜索引擎的研究与发现[D].武汉:武汉理工大学, 2008.

[5]胡俊, 李星.校园网信息资源搜索引擎的研究与实现[J].计算机工程与设计, 2006.7.

[6]张贤, 周娅.基于Lucene网页排序算法的改进.广西:计算机应用, 2009.

Lucene搜索 篇3

关键词:垂直搜索引擎,Lucene,Spider

1 垂直搜索引擎

1.1 垂直搜索引擎的特点

垂直搜索引擎又称为专题搜索引擎、专业搜索引擎。它们专门采集某一学科、某一主题、某一行业范围的信息资源, 并用更为详细和专业的方法对信息资源进行标引和描述, 且往往在信息组织时设计利用与该专业密切相关的方法技术。这种搜索引擎专注于自己的特长和核心技术, 保证了对该领域信息的完全收录与及时更新, 在提供专业信息方面有着大型通用搜索引擎无法比拟的优势。它的服务对象通常是专业领域的研究人员。众所周知, 每个专业领域都有专有的词汇和用语, 垂直搜索引擎使用与之相应的索引技术和检索语言, 从而使在特定主题范围内的检索效果优于通用搜索引擎。垂直搜索引擎因针对性强、目标明确和查准率高而成为获取专业信息的重要工具。

1.2 垂直搜索引擎的系统结构

垂直搜索引擎主要由主题爬虫模块、索引模块、检索模块、用户接口等4个部分组成, 如图1所示。

2 Lucene技术简介

Lucene作为一个优秀的全文检索引擎, 它的系统结构具有强烈的面向对象特征。首先是定义了一个与平台无关的索引文件格式, 其次通过抽象将系统的核心组成部分设计为抽象类, 具体的平台实现部分设计为抽象类的实现, 此外与具体平台相关的部分比如文件存储也封装为类, 经过层层的面向对象式的处理, 最终达成了一个低耦合高效率, 容易二次开发的检索引擎系统。

2.1 Lucene的系统结构组织

Lucene的系统由基础结构封装、索引核心、对外接口三大部分组成。其中直接操作索引文件的索引核心又是系统的重点, 如图2所示。

Lucene每个包完成的特定功能, 如表1所示:

2.2 Lucene的特点

Lucene作为一个全文检索引擎, 其具有如下突出的优点:

(1) 索引文件格式独立于应用平台。Lucene定义了一套以8位字节为基础的索引文件格式, 使得兼容系统或者不同平台的应用能够共享建立的索引文件。

(2) 在传统全文检索引擎的倒排索引的基础上, 实现了分块索引, 能够针对新的文件建立小文件索引, 提升索引速度。然后通过与原有索引的合并, 达到优化的目的。

(3) 优秀的面向对象的系统架构, 使得对于Lucene扩展的学习难度降低, 方便扩充新功能。

(4) 设计了独立于语言和文件格式的文本分析接口, 索引器通过接受Token流完成索引文件的创立, 用户扩展新的语言和文件格式, 只需要实现文本分析的接口。

(5) 已经默认实现了一套强大的查询引擎, 用户无需自己编写代码即使系统可获得强大的查询能力, Lucene的查询实现中默认实现了布尔操作、模糊查询 (Fuzzy Search[11]) 、分组查询等等。

3 垂直搜索引擎系统的设计与实现

笔者基于Lucene设计了一个垂直搜索引擎, 该系统包括了4个模块:信息采集、信息索引、信息检索种用户接口。

3.1 信息采集

由于Lucene本身没有网络爬虫 (Spider) , 需要我们自己重新设计一个专业网络爬虫 (Spider) , 然后集成到Lucene中。然后利用Spider从所有相关的专业网站库 (HTML库) 中抓取网页, 根据相关度分析算法, 对网页进行主题相关度分析, 根据相关度的不同来抓取相关网页, 最后把有效网页信息传输给索引器。

信息采集模块主要有3个类:

(1) Spider Frame类。Spider Frame类的功能:用户的输入界面。包括起始URL、文件保存目录、最多处理网页个数、启动线程个数, 线程休眠时间。可以停止Spider的运行。

(2) Show Frame类。Show Frame类的功能:Spider运行后, 显示运行的状态信息、可以停止Spider运行。

(3) Spider类。集成到Lucene中的信息采集类, 由Spider Frame类调用。有一个create () 方法, 执行实际的网页爬行工作。

信息采集模块的主要代码如下:

//此处创建Spider对象, initurl是起始URL, pagenum是最大可访问网页数,

3.2 信息索引

一个搜索引擎的有效性在很大程度上取决于索引的质量。索引模块将Spider收集的文档进行处理, 以便于组织查找到的有效数据结构。因此, 必须对索引进行高效组织, 以实现整个搜索引擎的高效率。

索引器主要完成将切词形成的顺排档文档组织成倒排档索引数据。索引的建立即索引器的实现, 主要分两步, 因为只有符合Lucene.Document要求的文档才能使用Lucene对其建立索引, 所以首先构造一个Document的文档对象doc, 其中包括描述数据域和正文数据域。然后对该doc文档建立索引, 对于描述数据, 因其体积小, 占字段多, 被检索率高, 所以直接存入索引库中, 而庞大的正文数据仅将其存放地址和文件名等存入索引库中。

3.3 信息检索

Lucene提供用户的检索接口是Index Searcher类, 由Query类封装查询词、查询字段和语言分析器, 交由Index Searcher查询。搜索结果返回的是Hits对象。

3.4 用户接口

用户接口提供可视化的查询输入和结果输出界面。采用JSP实现。

输入用户查询, 调用检索器, 将检索器返回的查询结果 (Hits) 分页显示在页面上, 同时使用Lucene中的Token信息对用户的查询字符高亮显示, 方便用户查看。

4 结束语

Lucene是一个基于Java的全文检索引擎工具包, 它不是一个完整的搜索引擎, 只提供了完整的查询引擎和索引引擎以及部分文本分析引擎。本系统在Lucene的基础上整合了专业网络爬虫Spider和Web服务器.建立了一个完整的垂直搜索引擎实例, 其组织比较完整, 查询功能强大.检索速度快, 搜索精度较高。在今后的研究中, 将在此系统的基础上.改进Spider, 使得Spider可以抓取由Javascript动态生成的网页内容;对Lucene中的检索结果排序算法进行改进以提高搜索精度。

参考文献

[1]孙西全, 马瑞芳, 李燕灵.基于Lucene的信息检索的研究与应用[J].信息系统, 2006, 29 (1) .

[2]郎小伟, 王申康.基于Lucene的全文检索系统研究与开发[J].计算机工程.2006 (2) .

[3]李晓明, 闫宏飞, 王继民.搜索引擎-原理、技术与系统[M].北京:科学出版社, 2005.

[4]Erik Hatcher, Otis Gospodetic.Lucene In Action[M].Manning Publications Co.2005.

Lucene搜索 篇4

关键词:搜索引擎,Lucene,企业搜索,中文分词

1 引言

伴随着企业信息化进程的加快, 信息搜索与查询技术己经成为影响企业综合效率的关键因素。许多企业己经建立了自己的内部网络 (Intranet) , 企业的规模越来越大, 积累的信息库也越来越多。传统的信息检索方式, 要耗费大量的人力和物力, 更重要的是由于信息流通不畅, 信息得不到充分的利用, 资料的查询和利用过程常常受某些因素的影响而造成人力和物力的浪费, 甚至因无法及时准确地得到正确的资料而失去发展的机会。于是, 使用搜索引擎来迅速准确地获取企业内部的信息, 自然而然成为了一个合理的选择。

2 搜索引擎

搜索引擎 (Search Engine) 是随着web信息的迅速增加, 从1994年开始逐渐发展起来的技术。实际上, 搜索引擎是一款特别的软件系统, 能够从互联网上自动搜集信息, 并为用户提供查询服务。搜索引擎对原始文档进行了一系列的整理和处理。用户的查询结果是搜索引擎按照某种规则计算获得的。

互联网搜索引擎通常由5个主要功能模块构成, 包括信息抓取、内容分析、索引建立、检索结果排序和检索工具与接口。主要功能模块结合其他信息处理和信息检索技术, 组成整个搜索引擎。

3 Lucene简介

Lucene是Apache软件基金会Jakarta项目组的成员项目, 是一个开放源代码的全文检索引擎工具包。Lucene目的是为软件开发人员提供一个简单易用的工具包, 以方便在目标系统中添加全文检索的功能, 或者是以此为基础建立起完善的全文检索系统。

Lucene是一个全文检索引擎, 其系统结构具有强烈的面向对象特征。首先是定义了一个与平台无关的索引文件格式, 其次通过抽象将系统的核心组成部分设计为抽象类, 具体的平台实现部分设计为抽象类的实现, 此外与具体平台相关的部分比如文件存储也封装为类, 经过层层的面向对象式的处理, 最终达成了一个低耦合高效率, 容易二次开发的检索引擎系统。图1为系统结构与源代码组织图。

4 企业搜索引擎设计与实现

现代企业信息化水平迅速提高, 企业信息管理目前已经度过了最初的纯数据和文档备份阶段。企业数据以每年200%的速度增长, 其中约80%的数据以文本文件、邮件等非结构化数据形式存放在企业内计算机系统中的各个角落。面对这些, 当万维网搜索开始束手无策的时候, 无论是公司高层还是基层员工都在憧憬有自己的搜索工具, 这就导致了企业搜索系统的出现。企业搜索引擎 (Enterprise Search Engine, ESE) 是指企业、政府、金融、教育、科研、媒体、医疗、军队、安全部门内部网络的搜索系统。

4.1 企业搜索引擎系统结构

企业搜索引擎依靠企业的硬件平台和网络环境, 针对企业的非结构化文档, 提供整体检索服务方案。其主要流程包括非结构化文档解析、建立索引, 进行检索并显示结果, 如图2所示:

本系统的开发环境为:Windows7操作系统, JDK1.6环境, Tomcat6.0, myEclipse8.0。

4.2 非结构化文档解析

4.2.1 HTML网页解析

HTML (Hyper Text Markup Language, 超文本置标语言) 是为“网页创建和其它可在网页浏览器中看到的信息”设计的一种置标语言。它是世界上最广泛使用的信息载体之一, 企业内保存了大量的HTML网页, 所以对HTML网页进行解析是企业搜索引擎开发中不可避免的问题。本文使用开源项目HTMLParser来实现HTML网页的解析, 版本为HTMLParser-2.0。其在分析处理中通过一系列的Tag对象, 形成网页的树结构。

public static void ParserHtmlText (String url, String pageEncoding) throws ParserException{

Parser parser = new Parser (url) ;

parser.setEncoding (pageEncoding) ;

TextExtractingVisitor visitor = new TextExtractingVisitor () ;

NodeFilter textFilter = new NodeClassFilter (TextNode.class) ;

NodeList nodes = parser.extractAllNodesThatMatch (textFilter) ;

for (int i=0;i

TextNode textnode = (TextNode) nodes.element (i) ;

String line = textnode.toPlainTextString () .trim () ;

……

}

parser.vistiALLNodesWith (visitor) ;

……

}

4.2.2 PDF文档解析

PDF的全称是Portable Document Format, 它是Adobe公司开发的电子文件格式。这种文件格式与操作系统平台无关, 可以在Windows、Unix或Mac OS等操作系统上通用[8]。常见的PDF文本抽取工具有PDFBox、xpdf、gunjpdf等, 其中最常用的就是PDFBox, 本文使用PDFBox-0.7.3版本。

public String GetTextFromPdf (String filename) throws Exception{

FileInputStream instream = new FileInputStream (filename) ;

PDFParser parser = new PDFParser (instream) ;

parser.parse () ;

PDFDocument pdfdocument = parser.getPDFDocument () ;

PDFTextStripper pdfstripper = new PDFTextStripper () ;

String contenttxt = pdfstripper.getText (pdfdocument) ;

……

}

4.2.3 Word文档解析

Office文档是目前最流行的文档格式, 几乎成为事实的文档标准, Word也成为办公文件的首选。在企业内部, 散落着大量的Word格式的文档。在Java中, 已经有很多对于Word的开源的解决方案, 其中比较出色的是Apache的Jakata项目的POI子项目。本文使用的是POI 3.6版本。

WordExtractor提供了一个文档内容访问的简单接口, 屏蔽了内部的流程和概念。能够直接通过该对象获得Word文档的全部文本内容, 但是无法进行灵活和复杂的提取控制。其核心代码如下:

public static void GetWordContent (String filename) throws Exception{

FileInputStream in = new FileInputStream (new file (filename) ) ;

WordExtractor extractor = new WordExtractor (in) ;

String text = extractor.getText () ;

……

}

4.3 中文分词实现

中文词法分析是中文信息处理的基础与关键。汉语词法分析系统ICTCLAS (Institute ofComputing Technology, Chinese Lexical Analysis System) , 主要功能包括中文分词;词性标注;命名实体识别;新词识别;同时支持用户词典;支持繁体中文;支持GBK、UTF-8、UTF-7、UNICODE等多种编码格式[9]。ICTCLAS3.0分词速度单机996KB/s, 分词精度98.45%, API不超过200KB, 各种词典数据压缩后不到3M, 是当前世界上最好的汉语词法分析器之一。WhuChineseAnalyzer是在ICTCLAS基础上修改扩展而来的中文分词器, 它能在Lucene中工作, 具有较强的中文分词效果。

4.4 建立索引

实现全文检索之前需要针对给定数据建立索引。索引文件的建立可以按照Lucene提供的一系列方法操作。通过对指定目录内容的分析, 编历并查找文件, 针对指定后缀的文件进行分析。分析后得到的文本内容进行索引, 形成的索引文件保存在磁盘, 用于后续的检索。

整个处理过程围绕文件夹的编历, 递归地完成索引创建工作。程序主流程负责完成生成源路径和目标文件访问对象。调用目录索引方法, 使用索引生成器最终形成索引。程序的主流程如图3所示:

其核心代码如下:

……

IndexWriter fsWriter = new IndexWriter (indexPath,

new WhuChineseAnalyzer () , true) ;

Directory ramDirectory = new RAMDirectory () ;

IndexWriter ramWriter = new IndexWriter (ramdirectory,

new WhuChineseAnalyzer () , false) ;

FileReader fpReader = new FileReader (file) ;

Document document = new Document () ;

Field field_name = new Field (“name”, file.getName () ,

Field.Store.YES, Field.Index.UN_TOKENIZED) ;

document.add (field_name) ;

Field field_path = new Field (“path”, file.getAbsolutePath () ,

Field.Store.YES, Field.Index.UN_TOKENIZED) ;

document.add (field_path) ;

Field field_content = new Field (“content”, fpReader) ;

document.add (field_content) ;

ramWriter.addDocument (document) ;

ramWrter.close () ;

fsWriter.addIndexes (new Directory[] {ramDirectory}) ;

……

4.5 检索器设计实现

检索器的功能是根据用户的查询在索引库中快速检出文档, 进行与查询的相关度评价, 对将要输出的结果进行排序, 返馈查询结果给用户。其基本流程为:首先, Parser程序接受用户的查询输入, 并对查询语句进行解析, 经过解析后得到查询逻辑;然后把查询逻辑交给Search模块, Search模块负责在索引数据库里进行匹配项查询。最后, 查到匹配集合后, 经过Lucene默认排序展现给用户。基本代码如下:

……

Analyzer ananlyzer = new WhuChineseAnalyzer () ;QueryParser parser = new QueryParser (“content”, analyzer) ;

try{

Query query = parser.parse (searchWords) ;

Hits hits = searcher.search (query)

for (int i=0;i

……

} catch (ParseException e1) {

……

}

}catch (IOException e) {

……

}

……

5 结论

本文对搜索引擎的基本原理和相关技术进行了研究, 并介绍了开源项目Lucene。通过对Lucene的扩展, 成功地实现了企业搜索引擎系统。从搜索结果来看, 也取得了不错的效果。但是由于理论知识的不足和经验的匮乏, 文章也有许多考虑不周全的地方, 以下几个方面需要进一步改进:一是实现更多种非格式化文档的解析, 例如Excel、XML等;二是进一步改进中文分词器, 实现更好的中文分词效果;三是优化系统, 更好地进行搜索结果的排序等。

参考文献

[1]王学松.Lucene+Nutch搜索引擎开发[M].北京:人民邮电出版社, 2008:3.

[2]The Apache Jakarta Project.Lucene[EB/OL].http//Jakarta.a-pache.org//lucene, 2010-05-21.

[3]薛宇星.基于Heritrix和Lucene的Web站内搜索系统[D].西安:西安电子科技大学, 2008.

[4]陈宁.Lucene全文检索在网络教学平台中的应用研究[D].大连:大连海事大学, 2007.

[5]Lucene中国[EB/OL].http//www.lucene.com.cn, 2010-05-27.

[6]李武装.基于语义的企业搜索引擎的研究与实现[J].电脑知识与技术, 2007, (8) :39-40.

[7]车东.Lucene:基于Java的全文检索引擎简介[EB/OL].ht-tp://www.chedong.com/tech/lucene.html, 2010-5-18.

[8]李武装.基于Ajax与语义的企业搜索引擎的研究与实现[D].长沙:国防科技大学, 2007.

[9]ICLCLAS.org.ICTCLAS的特色[EB/OL].http://ictclas.org/sub_1_2.html.

Lucene搜索 篇5

1 Lucene的构成及检索机制

1.1 Lucene的构成

Lucene是Apache基金会Jakarta的一个子项目,完全按照面向对象的思想设计而成。各个类之间满足低耦合的原则,是一个高效率的搜索工具包。Lucene完全由Java JDK开发而成,没有用到任何第三方开发包。基于Java语言良好的可移植性,Lucene也具有良好的跨平台特性。最新的Lucene开发包在2011年3月份发布,版本为3.0。

1.2 Lucene主要由以下部分组成

1)Analysis包。包括Lucene的语言分词器。最新的开发包提供很好的多语言分词器适应多语言检索系统的开发。

2)Index包。此包为Lucene的非常关键的一个包,包换Lucene中各种索引文件的生成以及索引的删除、更新等类。

3)Document包。包括Lucene中建立索引的数据结构,构成Lucene中索引文件的组成部分。

4)Messages包。提供一个消息接口。

5)Query Parse包。Lucene的查询分析包,提供各种查询间的各种运算,包括与,或,非等。

6)Store包。提供有关索引文件存储方式的包。

7)Search包。Lucene的检索包,这个包主要是提供在已经生成的索引(也就是用Index生成的各种类型的索引)之上进行检索的各个类。

8)Util包。一个工具包。

1.3 Lucene的索引机制

在Lucene中,索引(Index)由Segment组成,Segment由Document组成,Document由Field组成,Field由Term组成。生成的索引有三种存储方式:内存(RAM),文件系统(FS),数据库系统(DB)。RAM方式适用于小型的系统,FS方式适应于中型的搜索系统,DB方式适应于大型分布式的搜索系统。

以FS文件系统方式开发的搜索系统,会生成相应的索引文件。对于大中型的搜索系统,索引文件可能会存储于不同的目录中。Lucene的索引文件是以倒排文件的形式生成的。倒排文件直观上说就好像一本书的目录,这种结构的文件格式有利于Lucene提供高性能的检索服务。

1.4 Lucene中的多索引搜索

事实上,在一些成熟的商业系统中,索引并非总是存放在一个目录中。很多时候,系统会按照某种散列算法将文档分散地放置在不同的索引目录下[]。另外,还有可能在多个目录中存在着用户想要查找的内容。在Lucene中,有两种方式可以用于多目录索引的查找。

2 Multi Searcher方式

使用Multi Searcher方式查找,首先要构建一个Index Searcher数组,该数组中包括了若干的Index Searcher对象,分别用于查找不同的索引目录。这个数组被传入Multi Searcher的构造函数中。当Multi Searcher构造完毕后,可以调用searcher方法来进行查找。实际上,Multi Searcher的实现方式是用一个循环来遍历传入的Index Searcher数组,进行查找,并把结果集返回。

下面是Multi Searcher方式的关键代码:

1)建立Index Searcher对象

2)建立Searcher Index对象数组

3)应用Multi Searcher

2.1 Paralell Multi Searcher方式

Multi Searcher实际上是用一个循环来遍历Index Searcher的对象数组,然后把查询结果合并到一起。在这个过程中,只有一个索引被搜索,其他的索引一直处于等待状态。为了充分利用计算机并行处理问题的能力,Lucene中引入了具备多线程能力的ParalellMulti Searcher类提供对多个索引进行并行查询。在最新的Lucene 3.0中,Paralell Multi Searcher使用了线程池技术,下面先对Java中的线程池做一个简单的介绍。

2.2 Java线程池介绍

new Fixed Thread Pool创建一个指定工作线程数量的线程池。每当提交一个新任务就创建一个工作线程,当线程数量达到线程池的初始设置的数量时,则将任务存入到池队列中。

new Cache Thread Pool创建一个可缓存的线程池,这类线程池的工作线程的数量只受到系统中最大数量的限制,并且长时间没有新线程加入到池中的时候,线程池中的工作线程将自动中止。如果再有新的任务提交,则线程池重新创建新的工作线程。

new Single Thread Executor创建一种线程数量为1的Fixthread Pool,适用于对一个连续事务的处理。

new Schedule Thread Pool创建一个支持定长的线程池,最重要的是支持定时的任务执行。

2.3 Parallel Multi Searcher的具体实现

通过以上对Java线程池的介绍,笔者认为,new Cache Thread Pool这种线程池比较适合Lucene中多线程的查询应用。因为在Lucene的查询中,查询请求往往是间断的提交。比如一次请求对200个索引查询,然后间隔五分钟又有一个对300个索引的查询。由于这种间断性,如果选择new Fixed Thread Pool这种线程池,当没有查询请求时,线程池中的线程不会得到释放,会造成系统资源的大量占用。另一个原因,new Fixed Thread Pool的线程池大小在初始化的时候设定,而且不可以改变,线程池的初始值大小的选择可能对系统性能造成影响。

关键代码:

通过对以上两种方式的分析,让我们对Lucene中多线程检索有了更深的认识。下面是具体的实验情况。

3 实验结果分析

表1的数据是分别对10到1000个索引以两种方式进行查询时所用的时间比较,可以看出,多线程查询方式的优势还是比较明显的。

4 结束语

该文对Lucene中多索引查找的两种方式进行了介绍。在以前的Lucene版本中,多线程的搜索方式没有引入线程池,这样,线程每次都要进行初始化,造成多线程方式的性能低于Mutil方式。通过引入线程池,解决了这一问题,通过对实验数据的分析,验证了加入线程池技术的多索引搜索方式的优良性能。但通过实验也发现这种方式存在的问题,当线程数目很大时,可能会造成内存的溢出,在实际应用中,应该通过上层程序避免此种情况的发生。

摘要:Lucene是一个高性能、易扩展的基于Java技术的开源信息检索工具包,它可以为多种应用程序提供索引和搜索功能。该文探讨了Lucene中在多个索引上进行搜索的方式,分析了每种方式的性能以及应用范围,引进Java的线程池技术对多索引上的多线程搜索算法进行改进,并且通过实验验证改进算法的优越性。

关键词:Lucene,多索引,线程池

参考文献

[1]Gospodnetic O,Hatcher E.Lucene in action[M].Man2ning Publications Co,2005.

[2]邱哲,符滔滔,王学松.开发自己的搜索引擎Lucene+Heritrix.[M].2版.北京:人民邮电出版社,2010.

[3]李晓明,朱家稷,闫宏飞.互联网上主题信息的一种收集与处理模型及其应用[J].计算机研究与发展,2003,40(12).

[4]张敏,高剑峰,马少平.基于链接描述文本及其上下文的Web信息检索.计算机研究与发展,2004,41(1).

[5]孙建涛,沈科,陆玉昌等网页分类技术[J].清华大学学报:自然科学版,2004,44(1).

[6]李晓明,李星.搜索引擎与Web挖掘进展[M].北京:高等教育出版社,2003.

[7]徐宝文,张卫丰.搜索引擎与信息获取技术.[M].北京:清华大学出版社,2003.

Lucene搜索 篇6

关键词:垂直搜索引擎,主题爬虫,中文分词,Lucene,搜索结果个性化

引言

据不完全统计, 在农业领域现有各种网站近2万多个, 涉及农、林、牧、渔、水利、气象、农垦、乡镇企业、及其它农业部门, 在这些海量的信息中, 如何搜索一个准确的信息是大家非常关注的问题。在农业信息化的年代, 越来越多的农业相关的信息出现在各大网站, 很多农民朋友对大部分的农业门户网站并不熟悉, 且检索技巧不高, 加上通用搜索引擎返回的搜索结果数量巨大, 与主题相关性差的现实情况, 通用搜索引擎越来越难以满足农民朋友的检索需求。建立一个农业领域垂直搜索引擎, 让农民朋友快速、简捷、高效地获取分布在网络上的农业信息资源成了一项比较有意义的工作。

一、基于Lucene的农业类搜索引擎的体系结构设计

1.1基于Lucene的农业类搜索引擎整体体系结构。

在搭建基于Lucene的农业类搜索引擎的主要功能模块包括:主题爬虫模块、索引模块、检索模块以及搜索结果在线聚类模块[1]。其中索引模块和检索模块都在Lucene中有比较好的封装块, 针对Lucene对中文不能很好支持的缺点, 只需要提出更好的分词模块进行替换即可。本文主要的功能模块有数据采集模块、清洗分词索引模块以及前台的个性化展现模块。

数据采集模块通过改进的主题爬虫抓取农业主题相关的数据, 通过对解析出的URL进行主题相关性判断, 使得主题爬虫的准确率得到提高同时也减少了无效的抓取;数据清洗索引模块都是在Lucene框架中完成, 作为一个优秀的全文检索框架, 在最后的搜索结果个性化展现模块, Lucene中对检索功能的实现, 没有考虑个性化的需求, 根据文档的真实权重即td*idf来表示文档的重要性并按重要性将检索的结果集进行展现, 考虑到搜索引擎存在的一些问题, 将查询得到的结果集进行适当的处理如聚类也是提高用户体验的非常有用的一种途径。

1.2基于Lucene的农业类搜索引擎关键技术。

影响搜索引擎性能的主要因素有爬虫设计技术、中文分词技术等。接下来对这些关键技术进行简单的介绍。

1.2.1主题爬虫工作原理。

通用爬虫的工作原理是为了尽可能多的搜集网络上各种主题的信息, 设置爬虫按照一定的爬行策略进行爬行, 比如深度优先算法、广度优先算法等, 对爬得的网页通过分析网页的链接关系继续提取URL放入处理链表, 直到访问完所有的链接。它的目标是尽可能全、快的爬取网络上的资源, 同时按照一定的策略更新已经搜集的旧信息, 避免无效链接和死链接[2]。

表1对两种类型的爬虫从目标、爬行策略、页面分析技术、各自的优缺点、是否定期回访等方面进行了比较。

1.2.2中文分词技术。

分词技术指对文本进行分割为合理的词语或者单词序列, 在英文中, 词与词之间存在着空格, 使得分词比较容易执行, 在Lucene中提到的单字词切分主要就是针对英文提出的。中文分词技术从算法的角度可以分成三类, 基于字符串匹配的分词 (机械分词) 方法, 基于理解的分词方法和基于统计的分词方法。随着人工智能和机器学习中一些算法的成熟, 神经网络、遗传算法、决策树方法等被用在中文分词中[3]。

1.2.3查询服务。

现在的搜索引擎从用户输入关键字到得到返回结果的主要过程是:1) 在以基于关键字查询为主的搜索引擎中, 用户通过输入若干个关键字或者一小段文本进行查询;2) 搜索引擎通过对用户输入的查询信息进行分词、去除停用词等处理步骤, 得到有意义的检索关键字集, 通过与索引库中索引进行匹配, 对每个关键字匹配得到的文档集求交集, 即为最终应该返回的结果。这种交集型处理的方法是基于用户希望搜索尽可能多的包含指定关键字的文档。3) 通过一定的排序算法, 将上一步得到的文档进行排序。

二、多策略农业主题爬虫设计

2.1多策略农业主题爬虫的算法描述。

U R L决策器, 对页面分析出来的所有链接中, 首先按照host判断是否在所给定的8000多个中, 若不是则将该链接加入人工审核链中;若是, 继续判断path部分假如能在站点树中找到则加入处理链, 若不能则按照下面的判断方法判断是否主题相关。算法的流程图见图1。

1) 若当前URL为一级目录。判断是否与根结点相同:相同, 且已经存在则不用添加;若不同, 判断是否在已经收集的农业门户网站集中, 若存在于门户网站集中创建一个单独的树形结构, 由另外的线程进行抓取。

2) 若该URL是二级目录的形式, 首先对host部分根据步骤1) 判断, 若已存在则继续对path1进行主题相关性判断。

判断的方法:树形结构中的每个结点都有一个关键字数组, 每个数组中的值这样规定:对锚进行分词, 统计关键词的次数, 每个结点的关键字集合分别来自各个直接子节点的关键字集。显然根结点的关键字是整棵树中关键字集的并集。对当前URL的锚信息分词后的关键字信息与根结点的关键字集用向量空间的方法计算相似度, 满足一定的阈值, 则将该URL插入。

3) 对于URL的长度大于二级目录的可以用步骤2) 相同的方法进行处理。

4) 影响U R L优先级的主要参数有所在的树形结构的层级和主题相似度值。优先级显然是与相似度成正比。所在层级越低则越先加入处理链, 原因越是靠近叶子结点的URL若先下载的话, 该页面包含的链接信息比较少, 则能提供给根结点的关键字越少, 对后续页面与主题相关性计算的帮助也越小。假如网站的深度为A, 规定从根结点开始的各层的值分别是是调节系数。通过实验来设置a和b的初始值。

5) 每次执行完URL的插入操作后, 根据URL的优先级值将URL插入到URL等待链。

为了能够方便地处理链接和主题相关度的计算, 需要使用5个URL链, 每个链保存着统一处理状态的URL[4]。之所以采用链表的形式, 便于按照网页的优先级值对各个URL链进行排序, 特别是对处理链进行排序, 可以优先爬去与主题相关的网页, 这样设计使得爬虫的终止条件不唯一, 且保证了重要的网页优先被抓取。图2为网页抓取过程这些状态的切换流程。

2.2算法分析。

多策略农业主题爬虫从理论上来看, 具有如下几个特点:多种策略、可控制性、较小的网络开销、较小的实现代价。另外, 在计算网页重要度的时候, 通过考虑链接所在的层次作为该链接重要度的一个指标, 充分利用了链接层次与网页重要度的潜在信息。

通过分析以上特点, 理论上来说该算法具有一定的可行性。结合实验主要分析两个方面:一方面是该算法在维持主题相关性方面的效果, 即所抓取的网页是否是与主题有较高的相关性;另一方面, 评价该算法对重要网页的挖掘能力, 即首先用一种较客观的方法Page Rank算法或者Hits算法获得每个主题下所有网页重要性列表, 这两种算法都是通过分析网页之间的链接结构来计算网页重要度的, 所得到的每个主题对应的重要网页列表, 作为评价爬虫挖掘重要网页能力的依据。实验测试部分将在下一步展开。

三、对Lucene中文分词算法的扩展及其实现

本文提出了用二元语法模型和Viterbi算法实现的中文分词模型, 该方法首先将预切分文本分割成元句子的形式, 然后将每个元句子切分成原子的形式, 对每个元句子切分得到的原子根据二元语法模型, 匹配词典得到所有可能的切分路径, 然后调用相应的未登录词识别模块, 采用Viterbi算法求得概率最大的切分结果。最后通过随机抽取的语料进行测试, 结果表明该方法是有效的。

3.1分词算法原理。

1) 将待处理文本切割成元句子 (指两个切割标志之间的文本) 的形式;2) 对单个元句子分割成原子成分, 对各个原子成分和该原子的标记分别存放在两个数组;3) 对步骤2得到的盛放原子成分的数组进行初步处理, 得到除未登录词之外的切分形式;4) 对步骤3得到的结果用viterbi算法求出最佳切分路径, 调用未登录词识别模块;5) 若判断得到当前未登录词是人名, 则调用人名识别模块;若判断得到当前未登录词是地名, 则调用地名识别模块;若判断得到当前未登录词是组织名, 则调用组织名识别模块。6) 对处理结果进行词性标注等处理后返回。中文分词部分算法总体流程图见图3。

3.2算法详细步骤。

算法涉及到的类主要有Seg Graph.java, Tagger.java、Unknow Word Org.java, Unknow Wor_d Place.java、Unknow Word Person.java、Unknow Word Transperson.java等。Seg Graph.java主要实现步骤在前三步, Tagger.java是主要的控制类, 在步骤3的基础上对不同种类的未登录词分别调度不同的算法来识别, 其中Unknow Word Org.java、Unknow Word Place.java、Unknow Word Person.java、Unknow Word Transper_son.java分别是组织名、地名、中国人名、外国人名的识别模块[5]。

对单个元句子分割成原子成分, 对各个原子成分和该原子对应的标记分别存放在两个数组;对可能包含数字 (可能是整数或者小数) 、单个英文字符、汉字以及一些特殊字符如Ⅷ等分别进行判断。对元句子中的每个字符首先获取该字符的类型, 然后判断是否是英文字符、索引、整数或者小数、汉字等等, 将得到的这些类型的原子依次放入数组atom[], 将该原子所对应的类型标记分别存入数组atom POS[]。

对得到的原子成分进行初步处理, 得到除未登录词之外的切分形式, 形成分词后得到分词网络End List seg Graph。主要步骤如下:首先进行原子分词, 接着进行全切分即找出原子之间所有可能的组合。该过程使用的算法由两个循环来实现:第一层遍历整个原子集合;第二层在找到一个原子时, 不断把后面相邻的原子和该原子组合到一起, 访问词典看它们能否构成一个有意义的词组。全切分得到的结果为:“使/使用;用/用户;户;满/满意;意”, 将之转化为相应的有向无环图。使用维特比viterbi算法对有向无环图进行求解。当N=2时, 得到的“使/用户/满意”和“使用/户/满意”。

在实际的应用系统中单个词的概率值都比较小, 将各个词的概率相乘最终得出的概率趋于零, 使得最终难以比较各个切分结果的概率。常用的处理方法是用概率的负对数来代替概率本身, 词的概率的对数是负数, 取反则变成了正数, 通常将这个正数称作该词的“费用”。在用viterbi算法求最佳切分路径时, 只需找到总费用最小的路径。

四、总结

本文对搜索引擎以及垂直搜索引擎相关技术进行系统的研究, 特别是垂直搜索引擎的主题爬虫技术、中文分词技术以及搜索结果的在线聚类技术进行了详细的理论阐述、算法研究。简要介绍了Lucene中的中文分词技术, 随后提出了一种基于二元语法模型和维特比算法的中文分词算法。这种算法是对普通一元语法模型和最大概率法的改进, 通过维特比算法求最佳切分路径。通过分析搜索引擎在个性化方面存在的一些问题和目前的研究现状, 通过分析现有的文本聚类算法特别是比较适合在线搜索结果聚类的两种算法, 在实验阶段, 通过比较两种算法在聚类效果以及聚类标签描述方面的能力, 通过改变聚类文本集的大小设置三组实验。实验证明, STC算法和Lingo算法在处理小数据量时都能满足需求, 但是随着数据量的增大, 两种算法在某些方面有待改进。

参考文献

[1]Tanudjaja F, Mui L, Persona:A contextualized and Personalized Web Search.35th Annual Hawaii International Conference on System Sciences, 2002.

[2]刘艳华, 徐勇.不同搜索引擎在农业领域的应用效果对比[J].农业网络信息.

[3]周鹏, 吴华瑞, 赵春江, 等.基于Nutch农业搜索引擎的研究与设计[J].计算机工程与设计, 2009 (03) :56.

[4]郭来德, 刘辉林, 刘兰哲, 等.农业信息搜索引擎设计与实现[J].河北工程大学学报 (自然科学版) , 2007 (03) :33-34.

Lucene搜索 篇7

1.1 Lucene.Net简介

Lucene是一个开放的全文搜索引擎架构, 提供了完整的查询引擎和索引引擎, 最核心的特征是通过特殊的索引结构实现了传统数据库不擅长的全文索引机制, 并提供了扩展接口, 以方便针对不同应用的定制。

Lucene.Net是Java Lucene在.NET平台上最完整实现的一个开放源代码搜索引擎架构, 它采用C#开发, 完全实现了Java Lucene的每一个class和API, 因此功能与Java Lucene完全一致。

1.2 Lucene与数据库的对比 (略)

1.3 Lucene全文检索机制

Lucene全文检索通过把信息进行分解, 分解成众多的词元, 对每一个词元建立索引, 指明该词元在信息中出现的次数和位置, 查询的时候就在预先建立的索引中进行查找, 然后把查找的结果返回包含该关键词的文档索引号, 利用索引号就可以把信息展示给用户。因此其核心在于建立和维护索引库、提供快速有效的检索机制。在建立索引方面, Lucene是采用不断增加新的索引文件, 定期把这些小的索引文件进行合并的策略, 充分利用内存而减少对文件的操作, 提高索引效率。

2 CMS索引的建立与维护

2.1 索引内容抽象

CMS中管理的内容形式多样, 我们需要把不同形式的内容进行抽象, 建立需要索引的内容基本模型。用类实体的形式进行表示如下。

这样我们就可以为文章、图片、帖子、留言等不同的信息建立统一的索引模型, 这样当进行模糊查询的时候, 就可以实现对所有的信息进行查询的目的。否则就只能在查询系统中进行区分是查询新闻或者是查询论坛。

2.2 索引文档的建立

在CMS后台或者前台发布信息的时候, 及时增加索引文档。程序先把发布的信息组织成SearchContent, 然后通过如下方法创建索引文档。

Field.Store有两个选项:

COMPRESS压缩内容并存储在索引文件中, 通常用于长文本或二进制数据;

YES存储字段内容在索引文件中;

NO不保存内容到索引文件, 也就是不能通过Get方法获取字段值。

Field.Index有4个选项:

TOKENIZED分词且建立索引;

UN_TOKENIZED不分词但建立索引;

NO_NORMS和UN_TOKENIZED一样, 但是它把词条的附加信息全去掉了;

NO不建立索引。

2.3 索引文档添加到索引文件中

2.4 索引文档的删除和更新

在CMS中删除或者更新了信息之后, 我们也需要体现到索引中。

删除索引文档, 是对短语 (Term) 查询得到的进行删除操作。在索引字段中, Url是唯一标识每一条索引内容, 因此我们可以利用Url字段来实现唯一性查询条件。

由于Lucene中没有更新索引的功能, 因此更新操作需要其实就是先删除原有的索引再重新增加索引。

2.5 Lucene索引的性能优化

对大量信息进行索引是比较消耗时间和资源的操作, Lucene为我们提供了一些性能优化的工具。

MaxBufferedDocs:控制写入一个新的segment前内存中保存的document的数目, 设置较大的数目可以加快建立索引速度, 默认为10。如果内存资源充足, 可以设置多一点以减少文件操作。

MaxMergeDocs:控制一个segment中可以保存的最大document数目, 值较小有利于追加索引的速度, 默认Integer.MAX_VALUE, 无需修改。

MergeFactor:控制多个segment合并的频率, 值较大时建立索引速度较快, 默认是10, 可以在建立索引时设置为100。

由于CMS中对信息的维护是随机而零散的, 很难做到批量建立索引。而在操作一个大的索引文件时, 会消耗太多的系统资源。因此我们可以把索引分成基本不变的索引和经常变化的索引。

对经常变化的索引设置合适的MergeFactor参数, 让索引自动把多个segment进行合并。随着时间的推移, 我们再从经常变化的索引中把不再变化的部分合并到基本不变的索引中。

3 CMS站内搜索

3.1 搜索功能的实现

Lucene提供了很强大的查询接口, 利用这些接口可以实现丰富的查询功能。其中最为简单实用的就是MultiFieldQueryParser, 它封装了基本的查询接口, 让我们可以简单实现同时对多个字段进行查询。

上面的代码, 实现了同时在标题、摘要或者内容字段中对查询文本进行匹配。

有些信息需要授权才能访问, 因此需要对阅读权限进行处理。我们构建一个BooleanQuery查询, BooleanClause用于表示布尔查询子句关系的类, 包括:BooleanClause.Occur.MUST, BooleanClause.Occur.MUST_NOT, BooleanClause.Occur.S-HOULD, 一共有6种组合。

(1) MUST和MUST。取得连个查询子句的交集。

(2) MUST和MUST_NOT。表示查询结果中不能包含MUS T_NOT所对应得查询子句的检索结果。

(3) MUST_NOT和MUST_NOT。无意义, 检索无结果。

(4) SHOULD与MUST、SHOULD与MUST_NOT。SHOULD与MUST连用时, 无意义, 结果为MUST子句的检索结果。与MUST_NOT连用时, 功能同MUST。

(5) SHOULD与SHOULD。表示“或”关系, 最终检索结果为所有检索子句的并集。

3.2 获得分页查询结果

Hits获取到的是所有的查询结果索引, 我们要根据当前页号和页大小计算好记录开始和结束。

然后就可以取出分页的查询结果了。

3.3 查询结果的进一步处理

上面我们仅仅实现了查询结果的基本查询功能, 如果我们需要对结果排序或者过滤, 可以利用Lucene提供的Sort和Filter两个类, 用来实现对查询结果的排序与过滤。

可以利用词条搜索 (TermQuery) 、短语搜索 (PhraseQuery) 、通配搜索 (WildcardQuery) 、模糊搜索 (FuzzyQuery) 、前缀搜索 (PrefixQuery) 、范围搜索 (RangeQuery) 来构建高级搜索功能。

参考文献

[1]开放源代码的全文检索引擎Lucene[EB/OL].http://www.lucene.com.cn/about.htm, 2010.

[2]于天恩.Lucene搜索引擎开发权威经典[M].北京:中国铁道出版社, 2008.

【Lucene搜索】推荐阅读:

Lucene05-14

Lucene技术05-19

搜索算法07-19

主题搜索07-20

搜索方法07-20

搜索技术05-17

搜索优化05-18

搜索工具08-07

资源搜索08-08

语义搜索08-21

上一篇:饮食养生下一篇:恢复期护理