lucene实现全文搜索

  • 格式:doc
  • 大小:90.50 KB
  • 文档页数:7

lucene实现全文搜索

1.什么是全文搜索

全文检索是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程。

2.什么是lucene

apache lucene是一个开放源程序的搜寻器引擎,利用它可以轻易地为Java软件加入全文搜寻功能。lucene的最主要工作是替文件的每一个字作索引,索引 让搜寻的效率比传统的逐字比较大大提高,lucene提供一组解读,过滤,分析文件,编排和使用索引的API,它的强大之处除了高效和简单外,是最重要的是 使使用者可以随时应自已需要自订其功能。

lucene是apache软件基金会项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引 擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎。lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现 全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。

3.特点及优势

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

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

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

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

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

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

4.搜索的步骤

使用Lucene实现全文检索,主要有下面三个步骤:

1、建立索引库:根据网站新闻信息库中的已有的数据资料建立lucene索引文件。

2、通过索引库搜索:有了索引后,即可使用标准的词法分析器或直接的词法分析器实现进行全文检索。

3、维护索引库:网站新闻信息库中的信息会不断的变动,包括新增、修改及删除等,这些信息的变动都需要进一步反映到Lucene索引文件中。

5.搜索的应用

lucene技术博大精深,应用的范围也比较广泛,这里就讲解一下lucene对单表的搜索。 1. 下载

lucene的最新版本为3.0.3, lucene主页:/,下载地址为://lucene/java/lucene-3.0.3.zip,源码的下载地址为://lucene/java/lucene-3.0.3-src.zip。解压会出现lucene-core-3.0.3.jar、lucene-demos-3.0.3.jar两个jar包。

2. 配置

若java工程,要将jar包引入到class_path下,若是web工程,要将jar包引入到工程的 WEB-INF\lib目录下。对于lucene的系统结构和数据流,这里不做过多的介绍,如有疑问,请到/查询。在讲lucence搜索之前必须对它的一些名词解释和接口有所了解。下面主要对lucene的名词解释和接口做一下介绍。

3. lucene的名词解释及接口介绍

3.1 lucene的名词解释

1、IndexWriter

lucene中最重要的类之一,它主要是用来将文档加入索引,同时控制索引过程中的一些参数使用。

2、Analyzer

分析器,主要用于分析搜索引擎遇到的各种文本。常用的有StandardAnalyzer分析器,StopAnalyzer分析器,WhitespaceAnalyzer分析器等。

3、Directory

索引存放的位置。lucene提供了两种索引存放的位置,一种是磁盘,一种是内存。一般情况将索引放在磁盘上;相应地lucene提供了FSDirectory和RAMDirectory两个类。

4、Document

文档。Document相当于一个要进行索引的单元,任何可以想要被索引的文件都必须转化为Document对象才能进行索引。

5、Field

字段。

6、IndexSearcher

是lucene中最基本的检索工具,所有的检索都会用到IndexSearcher工具。

7、Query

查询,lucene中支持模糊查询,语义查询,短语查询,组合查询等等,如有TermQuery,BooleanQuery,RangeQuery,WildcardQuery等一些类。

8、QueryParser

是一个解析用户输入的工具,可以通过扫描用户输入的字符串,生成Query对象。

9、Hits

在搜索完成之后,需要把搜索结果返回并显示给用户,只有这样才算是完成搜索的目的。在lucene中,搜索的结果的集合是用Hits类的实例来表示的。

3.2 lucene的接口介绍

1、分析器Analyzer

分析器主要工作是筛选,一段文档进来以后,经过它,出去的时候只剩下那些有用的部分,其他则剔除。而这个分析器也可以自己根据需要而编写。

org.apache.lucene.analysis.Analyzer:这是一个虚构类,以下两个借口均继承它而来。org.apache.lucene.analysis.SimpleAnalyzer:分析器,支持最简单拉丁语言。org.apache.lucene.analysis.standard.StandardAnalyzer:标准分析器,除了拉丁语言还支持亚洲语言,并在一些匹配功能上进行完善。

2、IndexWriter

IndexWriter的构造函数有三种接口,针对目录Directory、文件File、文件路径String三种情况。例如:IndexWriter(String path, Analyzer a, boolean create),path为文件路径,a为分析器,create标志是否重建索引(true:建立或者覆盖已存在的索引,false:扩展已存在的索引)

一些重要的方法:

接口名 备注

addDocument(Document doc) 索引添加一个文档

addIndexes(Directory[] dirs) 将目录中已存在索引添加到这个索引

addIndexes(IndexReader[]

readers) 将提供的索引添加到这个索引

optimize() 合并索引并优化

close() 关闭

3、Document

Document文档类似数据库中的一条记录,可以由好几个字段(Field)组成,并且字段可以套用不同的类型。Document的几种接口:

接口名 备注

add(Field field) 添加一个字段(Field)到Document中

String get(String name) 从文档中获得一个字段对应的文本

Field getField(String name) 由字段名获得字段值

Field[] getFields(String name) 由字段名获得字段值的集

接口名 备注

4、Field

Field即上文所说的“字段”,它是Document的片段section。Field的构造函数:

Field(String name, String string, boolean store, boolean index, boolean token)。Indexed:如果字段是Indexed的,表示这个字段是可检索的。Stored:如果字段是Stored的,表示这个字段的值可以从检索结果中得到。Tokenized:如果一个字段是Tokenized的,表示它是有经过Analyzer转变后成为一个tokens序列,在这个转变过程tokenization中,Analyzer提取出需要进行索引的文本,而剔除一些冗余的词句。Field的几种接口:

Name Stored Indexed Tokenized use

Keyword(String

name, String

value) Y Y N date,url

Text(String

name, Reader

value) N Y Y short text

fields:

title,subject

Text(String

name, String

value) Y Y Y longer text

fields, like

“body”

UnIndexed(String

name, String

value) Y N N UnStored(String

name, 5、Query与QueryParser

主要使用方法:QueryParser .parse(String query, String field, Analyzer

analyzer),例如: Query query = QueryParser.parse("入门", "text", analyzer);

"入门"为检索词, "入门"为检索的字段名, analyzer为分析器。

6、Hits与Searcher

Hits的主要使用接口:

接口名 备注

Doc(int n) 返回第n个的文档的所有字段

length() 返回这个集中的可用个数

通过上面对lucene的名词解释和接口的介绍,下面lucene讲解搜索的实现工程。

4. 代码实现

首先创建一张blog表,表结构如下:

blogid varchar(10),

title varchar(50),

content varchar(1000),

url varchar(100)

并提供一个BaseItem实体,实体的属性与blog表的属性相同,便于存储从blog中查询出来的数据。

4.1获取数据

ConnBase dataConn = new ConnBase();// 数据库连接

Connection conn = dataConn.DBconn();

PreparedStatement ps = conn.prepareStatement(sql);

rs = ps.executeQuery();

while (rs.next()) {

BaseItem i = new BaseItem();

i.setBlogid(rs.getString("blogid"));

i.setTitle(rs.getString("title")); // 对应你的Blog表里的title

i.setContent(rs.getString("content")); // 取表里的博客内容

i.setUrl(rs.getString("url")); // 如a.action?id=8