george

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  12 Posts :: 0 Stories :: 17 Comments :: 0 Trackbacks

关于这个内容javaeye已经有不错的例子了
http://jnotnull.javaeye.com/blog/275327

在这个例子的基础上我想说一一些需要注意的地方。
1.重建索引和增量索引
IndexWriter writer = new IndexWriter(directory,analyzer,rebuild,new IndexWriter.MaxFieldLength(200000));

只需要在构造IndexWriter的时候设置rebuild值就可以了
当rebuild设为true的时候:就会删除原来的索引,重建索引文件
当rebuild设为false时:表示增量索引,是在原来索引文件的基础上增加新的索引内容,当然第一次没有索引文件的时候必须先重建索引生成索引文件。

在lucene2.4中不使用Field.Index.TOKENIZED而是使用Field.Index.ANALYZED,表示要对这个field进行分词
if(article.getArticleId()!=null)
    doc.add(
new Field(Fields.FIELD_ARTICLEID,article.getArticleId(),Field.Store.YES,Field.Index.NOT_ANALYZED));
if(article.getTitle()!=null)
    doc.add(
new Field(Fields.FIELD_TITLE,article.getTitle(),Field.Store.YES,Field.Index.ANALYZED));
当然这里的Fields.FIELD_ARTICLEID是自定义的类变量

2.分页检索

ScoreDoc[] hits = searcher.search(query,null,startIndex+perPage,new Sort(new SortField(Fields.FIELD_CHECKTIME,SortField.AUTO,true))).scoreDocs;
int numTotalHits = searcher.maxDoc();//hits.length;
int endIndex = Math.min(numTotalHits,startIndex + perPage);
使用searcher.maxDoc()取出搜索的总记录数,使用search(query,null,startIndex+perPage,new Sort(new SortField(Fields.FIELD_CHECKTIME,SortField.AUTO,true))).scoreDocs取出当前一页的索引记录(这个是2.4的新用法,可以获得更高的性能),new Sort(new SortField(Fields.FIELD_CHECKTIME,SortField.AUTO,true)))来处理索引结果的排序。
Document doc =searcher.doc(hits[i].doc);
String title1 
= doc.get(Fields.FIELD_TITLE);
使用searcher.doc(hits[i].doc)取出索引的具体记录

3.高亮显示
SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("<b><font color='red'>""</font></b>");
Highlighter highlighter 
= new Highlighter(simpleHTMLFormatter,
                    
new QueryScorer(query));           
highlighter.setTextFragmenter(
new SimpleFragmenter(bestMatchSize));
if (title1 != null) {
    TokenStream tokenStream 
= analyzer.tokenStream(Fields.FIELD_TITLE,
                        
new StringReader(title1));
    highLightTitle 
= highlighter.getBestFragment(tokenStream,title1);
}
new SimpleHTMLFormatter("<b><font color='red'>""</font></b>")构造高亮显示的样式。
highlighter.setTextFragmenter(new SimpleFragmenter(bestMatchSize))设置显示索引内容的最大字符数,相当于自动抽取含有关键的摘要。


当然这个只是简单索引和检索过程。
还有一些其他工作要做:
1.索引的过程就是查询的过程,需要把没有索引的文章查询出来进行索引,完毕有要打上标记。这里面就要为文章扩展索引标记,建立一些文章查询。
2.将索引操作加入调度定时执行,这个用quartz就可以了。



posted on 2009-03-18 21:48 georgeliu 阅读(1611) 评论(0)  编辑  收藏 所属分类: java

只有注册用户登录后才能发表评论。


网站导航: