当前位置:首页 > 网站旧栏目 > 学习园地 > 设计软件教程 > Lucene(Lucence)建立索引(字段)

Lucene(Lucence)建立索引(字段)
2010-01-13 23:09:43  作者:  来源:
   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.   }   
  62. }  

安徽新华电脑学校专业职业规划师为你提供更多帮助【在线咨询