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