浏览 12161 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-09-20
public void index(List<IArticle> list) { //IArticle接口提供getName(标题)和getContent(内容) //list就是从数据库里查询出来的要建立索引的对象的列表 if(list != null && list.size() > 0) { try { //标记是否重新建立索引,true为重新建立索引 boolean flag = true; //如果已存在索引,则追加索引 if(IndexReader.indexExists(path)) { flag = false; } ChineseAnalyzer ca = new ChineseAnalyzer(); IndexWriter indexWriter = new IndexWriter("c:/lucene/index",ca,flag); Document doc = null; for(int i=0;i<list.size();i++) { doc = new Document(); doc.add(new Field("title",article.getName(),Field.Store.YES,Field.Index.TOKENIZED)); //添加内容属性,内容只索引,不存储 doc.add(new Field("content",new StringReader(list.get(i).getContent()))); indexWriter.addDocument(doc); } //优化并关闭 indexWriter.optimize(); indexWriter.close(); } catch (Exception e) { // TODO 自动生成 catch 块 //e.printStackTrace(); } } } 简单说下需要注意的地方: 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的其他类对这个索引目录进行搜索了,关于搜索部分我们稍后再补充上. 下面是搜索部分的代码,写的简陋了点,比较简单,不再多说,请参看注释: public class Search { //定义一个索引搜索类对象 private IndexSearcher searcher = null; //定义一个Query对象 private Query query = null; //定义中文分析器 ChineseAnalyzer analyzer = new ChineseAnalyzer(); //构造方法里完成searcher的实例化 public Search() { try { //这里的参数就是上面我们生成索引的目录 searcher = new IndexSearcher(IndexReader.open("c:/lucene/index")); }catch(Exception e) { e.printStackTrace(); } } public Hits search(String keyword) throws Exception { //开始搜索的时间 Date start = new Date(); //对我们索引的content字段进行搜索 QueryParser qp = new QueryParser("content",analyzer); this.query = qp.parse(keyword); Hits hits = this.searcher.search(query); Date end = new Date(); System.out.println("检索完成,用时"+(end.getTime()-start.getTime())+"毫秒"); //////////打印测试//////// if(hits != null && hits.length() > 0) { for(int i = 0; i < hits.length(); i++) { try { Document doc = hits.doc(i); System.out.println("结果"+(i+1)+":"+doc.get("title")+" createTime:"+doc.get("content")); //System.out.println(doc.get("path")); }catch(Exception e) { e.printStackTrace(); } } } return hits; } ///调用,主方法 public static void main(String[] args) { try { Search test = new Search(); Hits h = test.search("你好"); } catch (Exception e) { // TODO 自动生成 catch 块 e.printStackTrace(); } } } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |