Lucene(Lucence)建立索引(字段)

时间:2022-11-18 05:39:20

Lucene,这是官方称谓,也有许多人叫它Lucence,做搜索和分词用的工具包.也有人说是Java下的搜索引擎框架库,见仁见智的说法罢了.不管 叫什么,确实非常有用,比如做全站的搜索,其实它的用处远大于此,但凡涉及到文本搜索的地方就能用到它.我们就以做全站搜索为例,演示一下如何应用 Lucene建立索引.

Java代码
  1. public   void  index(List<IArticle> list)  
  2. {  
  3.   //IArticle接口提供getName(标题)和getContent(内容)   
  4.   //list就是从数据库里查询出来的要建立索引的对象的列表   
  5.   if (list !=  null  && list.size() >  0 )  
  6.   {  
  7.     try  {  
  8.            //标记是否重新建立索引,true为重新建立索引   
  9.            boolean  flag =  true ;  
  10.            //如果已存在索引,则追加索引   
  11.            if (IndexReader.indexExists(path))  
  12.       {  
  13.          flag = false ;  
  14.            }  
  15.       ChineseAnalyzer ca = new  ChineseAnalyzer();  
  16.       IndexWriter indexWriter = new  IndexWriter( "c:/lucene/index" ,ca,flag);           
  17.       Document doc = null ;  
  18.       for ( int  i= 0 ;i<list.size();i++)  
  19.           {  
  20.         doc = new  Document();  
  21.         doc.add(new  Field( "title" ,article.getName(),Field.Store.YES,Field.Index.TOKENIZED));  
  22.        //添加内容属性,内容只索引,不存储   
  23.        doc.add(new  Field( "content" , new  StringReader(list.get(i).getContent())));  
  24.        indexWriter.addDocument(doc);  
  25.       }  
  26.            //优化并关闭   
  27.       indexWriter.optimize();  
  28.       indexWriter.close();  
  29.        } catch  (Exception e)   
  30.        {  
  31.       // TODO 自动生成 catch 块   
  32.       //e.printStackTrace();   
  33.        }  
  34.   }  
  35. }  


简单说下需要注意的地方:
1.ChineseAnalyzer ca = new ChineseAnalyzer();这个是分析器,Lucene内置多个,处理中文搜索我会用ChineseAnalyzer.
2.IndexWriter indexWriter = new IndexWriter(c:/lucene/index,ca,true);处理索引的类,注意其构造方法里的最后一个参数,如果为true则表示,下 次建立索引时会清除这次建立的索引重新建立索引,如果为false则表示追加索引,在原来索引的基础上追加.看实际情况定true或false.
3.doc.add(new Field("title",article.getName(),Field.Store.YES,Field.Index.TOKENIZED));这一句表示为文章标题建立索引并存储.
4.doc.add(new Field("content",new StringReader(list.get(i).getContent())));这句是为内容建立索引但不存储
   这样我们就为文章对象建立好索引了,然后就可以利用Lucene的其他类对这个索引目录进行搜索了,关于搜索部分我们稍后再补充上.
   下面是搜索部分的代码,写的简陋了点,比较简单,不再多说,请参看注释:

Java代码
  1. public   class  Search  
  2. {  
  3.   //定义一个索引搜索类对象   
  4.   private  IndexSearcher searcher =  null ;  
  5.   //定义一个Query对象   
  6.   private  Query query =  null ;  
  7.   //定义中文分析器   
  8.   ChineseAnalyzer analyzer = new  ChineseAnalyzer();  
  9.   //构造方法里完成searcher的实例化   
  10.   public  Search()  
  11.   {  
  12.     try   
  13.     {  
  14.      //这里的参数就是上面我们生成索引的目录   
  15.      searcher = new  IndexSearcher(IndexReader.open( "c:/lucene/index" ));  
  16.     }catch (Exception e)  
  17.     {  
  18.       e.printStackTrace();  
  19.     }  
  20.   }  
  21.   public  Hits search(String keyword)  throws  Exception  
  22.   {  
  23.     //开始搜索的时间   
  24.     Date start = new  Date();  
  25.     //对我们索引的content字段进行搜索   
  26.     QueryParser qp = new  QueryParser( "content" ,analyzer);  
  27.     this .query = qp.parse(keyword);  
  28.     Hits hits = this .searcher.search(query);  
  29.     Date end = new  Date();  
  30.     System.out.println("检索完成,用时" +(end.getTime()-start.getTime())+ "毫秒" );  
  31.     //////////打印测试////////   
  32.     if (hits !=  null  && hits.length() >  0 )  
  33.     {  
  34.       for ( int  i =  0 ; i < hits.length(); i++)  
  35.       {  
  36.         try   
  37.         {  
  38.           Document doc = hits.doc(i);  
  39.           System.out.println("结果" +(i+ 1 )+ ":" +doc.get( "title" )+ " createTime:" +doc.get( "content" ));   
  40.           //System.out.println(doc.get("path"));   
  41.         }catch (Exception e)  
  42.         {  
  43.           e.printStackTrace();  
  44.         }  
  45.       }  
  46.     }  
  47.     return  hits;  
  48.   }  
  49.   ///调用,主方法   
  50.   public   static   void  main(String[] args)  
  51.   {  
  52.     try    
  53.     {  
  54.       Search test = new  Search();  
  55.       Hits h = test.search("你好" );  
  56.     } catch  (Exception e)   
  57.     {  
  58.       // TODO 自动生成 catch 块   
  59.        e.printStackTrace();  
  60.     }  
  61.   }