Lucene初步应用(二)
时间:2007-07-29 来源:sdwsyjp
我们可以将全文检索库与通常的关系型数据库(如Oracle,Mysql)作一下对比。
检索源码及说明
说明:该类中Searcher负责查询,并把查询结果以Hits对象集方式返回,(一)Hits好比JDBC中的RecordSet,(二)Hits是Document的集合,每个Document相当于一条记录,Document中包含一个或多个字段,可以通过(三)Document.get(“字段名”)方法得到每个字段的内容。
通过这三个类,就完成了一个简单的基于Lucene的全文检索应用。
4.总结
Lucene十分精练纯粹,就一个jar包,引入到你的工程中,调用其接口,就可以为你的应用增添全文检索功能。
通过上一节的初步应用会发现,Lucene使用起来很简单,与JDBC有些类似,应用时重点掌握好IndexWriter,Document,Field,Searcher等几个类即可。
Lucene的结构很清晰,每个package司职一项,比如(一)org.apache.Lucene.search负责检索,(二)org.apache.Lucene.index索引,(三)org.apache.Lucene.analysis切词等,且Lucene的主要动作都采用了抽象类,扩展起来十分方便。
相对于一些商业化全文检索,Lucene的入库速度更快。因为它的存储采取分步合并的方法,先建立小索引,待时机成熟才把小索引合并到大索引树上。因此,我们在操作应用数据时可以同步进行全文检索库的操作而不会(或许很少)影响系统的效能。
Lucene性能稳定,使用简单,而且开源免费,有Apache基金在后面做支撑,资金和技术力量都十分雄厚,这两年也一直是稳步更新,每次新版本的推出,业界均争相报导。
全文检索库对关系型数据库对比 | ||
对比项 | 全文检索库(Lucene) | 关系型数据库(Oracle) |
核心功能 | 以文本检索为主,插入(insert)、删除(delete)、修改(update)比较麻烦,适合于大文本块的查询。 | 插入(insert)、删除(delete)、修改(update)十分方便,有专门的SQL命令,但对于大文本块(如CLOB)类型的检索效率低下。 |
库 | 与Oracle类似,都可以建多个库,且各个库的存储位置可以不同。 | 可以建多个库,每个库一般都有控制文件和数据文件等,比较复杂。 |
表 | 没有严格的表的概念,比如Lucene的表只是由入库时的定义字段松散组成。 | 有严格的表结构,有主键,有字段类型等。 |
记录 | 由于没有严格表的概念,所以记录体现为一个对象,在Lucene里记录对应的类是Document。 | Record,与表结构对应。 |
字段 | 字段类型只有文本和日期两种,字段一般不支持运算,更无函数功能。 在Lucene里字段的类是Field,如document(field1,field2…) | 字段类型丰富,功能强大。 record(field1,field2…) |
查询结果集 | 在Lucene里表示查询结果集的类是Hits,如hits(doc1,doc2,doc3…) | 在JDBC为例, Resultset(record1,record2,record3...) |
QueryRecords.java |
package com.holen.part1; import java.util.ArrayList; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.queryParser.QueryParser; import org.apache.lucene.search.Hits; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.Searcher; /** * @author Holen Chen * 检索查询 */ public class QueryRecords { public QueryRecords() { } /** * 检索查询,将结果集返回 * @param searchkey * @param dbpath * @param searchfield * @return */ public ArrayList queryRecords(String searchkey,String dbpath,String searchfield){ ArrayList list = null; try{ Searcher searcher = new IndexSearcher(dbpath); Query query = QueryParser.parse(searchkey,searchfield,new StandardAnalyzer()); Hits hits = searcher.search(query); if(hits != null){ list = new ArrayList(); int temp_hitslength = hits.length(); Document doc = null; for(int i = 0;i < temp_hitslength; i++){ doc = hits.doc(i); list.add(doc.get("filename")); } } }catch(Exception ex){ ex.printStackTrace(); } return list; } public static void main(String[] args) { QueryRecords temp = new QueryRecords(); ArrayList list = null; list = temp.queryRecords("holen","e:\\lucene\\holendb","content"); for(int i=0;i< list.size();i++){ System.out.println((String)list.get(i)); } } } |
相关阅读 更多 +