文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>Lucene初步应用(二)

Lucene初步应用(二)

时间:2007-07-29  来源:sdwsyjp

我们可以将全文检索库与通常的关系型数据库(如Oracle,Mysql)作一下对比。  
全文检索库对关系型数据库对比
对比项 全文检索库(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));        }           } }  
  说明:该类中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基金在后面做支撑,资金和技术力量都十分雄厚,这两年也一直是稳步更新,每次新版本的推出,业界均争相报导。
相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载