lucene 高亮显示

来源:互联网 发布:ssl模块编译进nginx 编辑:程序博客网 时间:2024/05/01 23:21
 

package src;

import java.io.StringReader;
import java.util.Date;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.SimpleAnalyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.cjk.CJKAnalyzer;
import org.apache.lucene.analysis.cn.ChineseAnalyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.FuzzyQuery;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;

import java.util.Date;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexReader;
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.highlight.Highlighter;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.SimpleFragmenter;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;

public class LuceneSearch {
 public static void main(String[] args) throws Exception{
  LuceneSearch test = new LuceneSearch();
  //
  Hits h = null;
  h = test.search("显示 ");
  test.printResult(h);
  
  
  h = test.search("jy*");
  test.printResult(h);
  
  h = test.search("djy");
  test.printResult(h);
  

 }
 public LuceneSearch(){
  try{
   searcher = new IndexSearcher(IndexReader.open("E://lucene//test4//index"));
  }catch(Exception e){
   e.printStackTrace();
  }
 }
 //声明一个IndexSearcher对象
 private IndexSearcher searcher = null;
 //声明一个Query对象
 private Query query = null;
 ChineseAnalyzer analyzer = new ChineseAnalyzer();
 Highlighter highlighter = null;
 public final Hits search(String keyword){
  System.out.println("正在检索关键字:"+keyword);
  try{
   QueryParser qp = new QueryParser("title",analyzer);
   query = qp.parse(keyword);
   
   Term term = new Term("content",keyword);
   FuzzyQuery fq = new FuzzyQuery(term);
   Date start = new Date();
   
   //Hits hits = searcher.search(query);
   Hits hits = searcher.search(query);
 
   
   //高亮显示设置
   SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("<read>","</read>");   
   highlighter = new Highlighter(simpleHTMLFormatter,new QueryScorer(query));      
   highlighter.setTextFragmenter(new SimpleFragmenter(10));//这个100是指定关键字字符串的context的长度,你可以自己设定,因为不可能返回整篇正文内容
 
   
   
   Date end = new Date();
   System.out.println("检索完成,用时"+(end.getTime()-start.getTime())+"毫秒");
   return hits;
  }catch(Exception e){
   e.printStackTrace();
   return null;
  }
  
 }
 
 
 public void printResult(Hits h){
  if(h.length() == 0){
   System.out.println("对不起,没有找到您要的结果.");
  }else{
   for(int i = 0; i < h.length(); i++){
    try{
     Document doc = h.doc(i);
     System.out.println("这个是"+(i+1)+"个结果:"+doc.get("id")+" title:"+doc.get("title")+"        content:"+doc.get("content"));
     
     //高亮出显示
     TokenStream tokenStream =analyzer.tokenStream("content", new StringReader(doc.get("title")));
     System.out.println(highlighter.getBestFragment(tokenStream,h.doc(i).get("title")));

     //System.out.println(doc.get("path"));
    }catch(Exception e){
     e.printStackTrace();
    }
   }
  }
  System.out.println("--------------------------------------");
 }
}

 

private void printResult(Hits h) {
        if (h.length() > 0) {
            for (int i = 0; i < h.length(); i++) {
                SearchResultModel resultModel = new SearchResultModel();
                try {
                    Document doc = h.doc(i);
                    resultModel.setId(i);
                    resultModel.setFileName(doc.get("filename"));
                    resultModel.setUrl(doc.get("path"));
                    resultModel.setDateTime(doc.get("datetime"));
                    // 高亮出显示
                      /*需要注意的是,如果标题或者内容中没有需要高亮显示的关键字,那么标题或者内容是为null,所以做了下面的处理。判断标题或者内容是否空,如果空,截取前面的部分字符。*/
                    TokenStream tokenStream1 = analyzer.tokenStream("title",
                            new StringReader(doc.get("title")));
                    String sTitle = highlighter.getBestFragment(tokenStream1,doc.get("title"));
                    String sTitle2 = doc.get("title");
                    resultModel.setTitle(sTitle!=null?sTitle:sTitle2);
                    TokenStream tokenStream = analyzer.tokenStream("contents",
                            new StringReader(doc.get("contents")));
                    String sContent = highlighter.getBestFragment(tokenStream,
                            doc.get("contents"));
                    String sContent2 = doc.get("contents");
                    resultModel.setContent(sContent!=null?sContent:sContent2.substring(0,100)+"...");
                } catch (Exception e) {
                    e.printStackTrace();
                }
                this.mapResult.put(i, resultModel);
            }
        }
    }

原创粉丝点击