Lucene+HighLighter高亮显示实例 lucene高亮实例

今天搞了一个关于Lucene的例子,权当入门教程。网上有很多资料,但是要么不全、要么不好用,所以这里把全部代码以及依赖的包贴上来了。



功能包括:创建索引、检索索引、高亮显示查询结果。分词使用的庖丁解牛。



使用前先下载相关的LuceneCore jar包、LuceneHighLighterjar包、庖丁解牛分分词jar包、庖丁解牛词典。并设定环境变量PAODING_DIC_HOME指向词典位置。

前两个可以到官方网站找,庖丁去http://code.google.com/p/paoding/downloads/list下载。



Lucene庖丁整合方式1:

1、将paoding-analysis.jar拷贝到项目的WEB-INF/lib目录;
2、接着需要设置环境变量PAODING_DIC_HOME,变量名:PAODING_DIC_HOME变量值:E:paodingdic
3、第三步将E:paodingsrc目录下的paoding-dic-home.properties属性文件拷贝到项目的src目录下,添加2行

paoding.dic.home.config-fisrt=this
paoding.dic.home=E:/paoding/dic

Lucene庖丁整合方式2:

修改E:paodingsrcpaoding-dic-home.properties,增加一行

paoding.dic.home=classpath:dic

然后运行ant重新生成一个庖丁jar,拷贝到lib下就OK了。

第一种方式便于更新字典,第二种便于移植。本例使用第二种方法整合。

关于庖丁环境的设置可以参考netpaodinganalysisConstants.java。





使用时注意LuceneCore和LuceneHighLighter的版本配置。我开始使用lucene-core-2.3.2.jar+Highlighter2.4,后台报错,明显的版本问题。现在使用的是Lucene 2.3.2 + Highlighter 2.2.0。



主要代码实现:

CreateIndex:创建索引文件
Java代码
  1. packagedemo;
  2. importjava.io.BufferedReader;
  3. importjava.io.File;
  4. importjava.io.FileInputStream;
  5. importjava.io.IOException;
  6. importjava.io.InputStreamReader;
  7. importjava.util.Date;
  8. importnet.paoding.analysis.analyzer.PaodingAnalyzer;
  9. importorg.apache.lucene.analysis.Analyzer;
  10. importorg.apache.lucene.document.Document;
  11. importorg.apache.lucene.document.Field;
  12. importorg.apache.lucene.index.IndexWriter;
  13. publicclassCreateIndex{
  14. publicvoidcreateIndex()throwsException{
  15. FilesurceFileDir=newFile("D:\save\source");
  16. FileindexFileDir=newFile("D:\save");
  17. //AnalyzerluceneAnalyzer=newStandardAnalyzer();
  18. AnalyzerluceneAnalyzer=newPaodingAnalyzer();//使用庖丁解牛分词法
  19. IndexWriterindexWriter=newIndexWriter(indexFileDir,luceneAnalyzer,true);///参数isEmpty是false表示增量索引
  20. File[]sourceFextFiles=surceFileDir.listFiles();
  21. longstartTime=newDate().getTime();
  22. //增加document到索引去
  23. for(inti=0;i<sourceFextFiles.length;i++){
  24. if(sourceFextFiles[i].isFile()
  25. &&sourceFextFiles[i].getName().endsWith(".txt")){
  26. System.out.println("File"+sourceFextFiles[i].getCanonicalPath()+"正在被索引....");
  27. Stringtemp=FileReaderAll(sourceFextFiles[i].getCanonicalPath(),"GBK");
  28. System.out.println(temp);
  29. Documentdocument=newDocument();
  30. FieldFieldPath=newField("path",sourceFextFiles[i].getPath(),Field.Store.YES,Field.Index.NO);
  31. FieldFieldBody=newField("body",temp,Field.Store.YES,Field.Index.TOKENIZED,Field.TermVector.WITH_POSITIONS_OFFSETS);
  32. FieldFieldTitle=newField("title",temp,Field.Store.YES,Field.Index.TOKENIZED,Field.TermVector.WITH_POSITIONS_OFFSETS);
  33. document.add(FieldPath);
  34. document.add(FieldBody);document.add(FieldTitle);
  35. indexWriter.addDocument(document);
  36. }
  37. }
  38. //optimize()方法是对索引进行优化
  39. indexWriter.optimize();
  40. indexWriter.close();
  41. //测试一下索引的时间
  42. longendTime=newDate().getTime();
  43. System.out.println("这花费了"+(endTime-startTime)+"毫秒来把文档增加到索引里面去!"
  44. +indexFileDir.getPath());
  45. }
  46. publicstaticStringFileReaderAll(StringFileName,Stringcharset)
  47. throwsIOException{
  48. BufferedReaderreader=newBufferedReader(newInputStreamReader(
  49. newFileInputStream(FileName),charset));
  50. Stringline=newString();
  51. Stringtemp=newString();
  52. while((line=reader.readLine())!=null){
  53. temp+=line;
  54. }
  55. reader.close();
  56. returntemp;
  57. }
  58. publicstaticvoidmain(String[]args){
  59. try{
  60. newCreateIndex().createIndex();
  61. }catch(Exceptione){
  62. e.printStackTrace();
  63. }
  64. }
  65. }
package demo;     import java.io.BufferedReader;   import java.io.File;   import java.io.FileInputStream;   import java.io.IOException;   import java.io.InputStreamReader;   import java.util.Date;     import net.paoding.analysis.analyzer.PaodingAnalyzer;     import org.apache.lucene.analysis.Analyzer;   import org.apache.lucene.document.Document;   import org.apache.lucene.document.Field;   import org.apache.lucene.index.IndexWriter;         public class CreateIndex {              public void createIndex() throws Exception {                     File surceFileDir = new File("D:\save\source");                       File indexFileDir = new File("D:\save");                      //Analyzer luceneAnalyzer = new StandardAnalyzer();           Analyzer luceneAnalyzer = new PaodingAnalyzer();//使用庖丁解牛分词法                      IndexWriter indexWriter = new IndexWriter(indexFileDir, luceneAnalyzer, true);///参数isEmpty是false表示增量索引           File[] sourceFextFiles = surceFileDir.listFiles();           long startTime = new Date().getTime();             // 增加document到索引去           for (int i = 0; i < sourceFextFiles.length; i++) {               if (sourceFextFiles[i].isFile()                       && sourceFextFiles[i].getName().endsWith(".txt")) {                   System.out.println("File " + sourceFextFiles[i].getCanonicalPath() + "正在被索引....");                   String temp = FileReaderAll(sourceFextFiles[i].getCanonicalPath(), "GBK");                   System.out.println(temp);                   Document document = new Document();                   Field FieldPath = new Field("path", sourceFextFiles[i].getPath(), Field.Store.YES, Field.Index.NO);                   Field FieldBody = new Field("body", temp, Field.Store.YES, Field.Index.TOKENIZED, Field.TermVector.WITH_POSITIONS_OFFSETS);                   Field FieldTitle = new Field("title", temp, Field.Store.YES, Field.Index.TOKENIZED, Field.TermVector.WITH_POSITIONS_OFFSETS);                   document.add(FieldPath);                   document.add(FieldBody);document.add(FieldTitle);                   indexWriter.addDocument(document);               }           }           // optimize()方法是对索引进行优化           indexWriter.optimize();           indexWriter.close();             // 测试一下索引的时间           long endTime = new Date().getTime();           System.out.println("这花费了" + (endTime - startTime) + " 毫秒来把文档增加到索引里面去!"                  + indexFileDir.getPath());       }         public static String FileReaderAll(String FileName, String charset)               throws IOException {           BufferedReader reader = new BufferedReader(new InputStreamReader(                   new FileInputStream(FileName), charset));           String line = new String();           String temp = new String();             while ((line = reader.readLine()) != null) {               temp += line;           }           reader.close();           return temp;       }               public static void main(String[] args) {           try {               new CreateIndex().createIndex();           } catch (Exception e) {               e.printStackTrace();           }         }     }  

QueryHighLighter:检索关键字并高亮显示
Java代码
  1. packagedemo;
  2. importjava.io.StringReader;
  3. importnet.paoding.analysis.analyzer.PaodingAnalyzer;
  4. importorg.apache.lucene.analysis.Analyzer;
  5. importorg.apache.lucene.analysis.TokenStream;
  6. importorg.apache.lucene.document.Document;
  7. importorg.apache.lucene.queryParser.QueryParser;
  8. importorg.apache.lucene.search.BooleanClause;
  9. importorg.apache.lucene.search.IndexSearcher;
  10. importorg.apache.lucene.search.Query;
  11. importorg.apache.lucene.search.ScoreDoc;
  12. importorg.apache.lucene.search.TopDocCollector;
  13. importorg.apache.lucene.search.highlight.Highlighter;
  14. importorg.apache.lucene.search.highlight.QueryScorer;
  15. importorg.apache.lucene.search.highlight.SimpleFragmenter;
  16. importorg.apache.lucene.search.highlight.SimpleHTMLFormatter;
  17. importtest.TestLuceneHighlighter2;
  18. publicclassQueryHighLighter{
  19. privatestaticfinalStringFIELD_TITLE="title";
  20. privatestaticfinalStringFIELD_BODY="body";
  21. publicsynchronizedAnalyzergetAnalyzer(){
  22. returnnewPaodingAnalyzer();//此处使用"庖丁解牛"分词法,另外一种是中科院分词法
  23. }
  24. publicStringtest(StringqueryString,intbegin,intnumber){
  25. StringBuffersb=newStringBuffer();
  26. IndexSearcherisearcher=null;
  27. try{
  28. isearcher=newIndexSearcher("D:\save");
  29. BooleanClause.Occur[]clauses={BooleanClause.Occur.SHOULD,
  30. BooleanClause.Occur.SHOULD};
  31. TopDocCollectorcollector=newTopDocCollector(10);
  32. QueryParserqueryParse=newQueryParser(FIELD_TITLE,getAnalyzer());
  33. Queryquery=queryParse.parse(queryString);
  34. isearcher.search(query,collector);
  35. ScoreDoc[]hits=collector.topDocs().scoreDocs;
  36. //用这个进行高亮显示,默认是<b>..</b>
  37. //用这个指定<read>..</read>
  38. SimpleHTMLFormattersimpleHTMLFormatter=newSimpleHTMLFormatter("<b><fontcolor='red'>","</font></b>");
  39. //构造高亮
  40. //指定高亮的格式
  41. //指定查询评分
  42. Highlighterhighlighter=newHighlighter(simpleHTMLFormatter,newQueryScorer(query));
  43. //这个一般等于你要返回的,高亮的数据长度
  44. //如果太小,则只有数据的开始部分被解析并高亮,且返回的数据也少
  45. //太大,有时太浪费了。
  46. highlighter.setTextFragmenter(newSimpleFragmenter(Integer.MAX_VALUE));
  47. for(inti=begin;i<hits.length&&i<begin+number;i++){
  48. Documentdoc=isearcher.doc(hits[i].doc);
  49. Stringvalue=doc.get(FIELD_TITLE);
  50. Stringvalue2=doc.get(FIELD_BODY);
  51. //有三个参数
  52. //分析器
  53. //要解析的字段名
  54. //要解析的数据
  55. //System.out.println(highlighter.getBestFragment(getAnalyzer(),
  56. //FIELD_TITLE,doc.get(FIELD_TITLE)));
  57. if(value!=null){
  58. TokenStreamtokenStream=getAnalyzer().tokenStream(FIELD_TITLE,newStringReader(value));
  59. Stringstr=highlighter.getBestFragment(tokenStream,value);
  60. sb.append("<li><li>").append(str).append("<br/>");
  61. System.out.println(str);
  62. }
  63. }
  64. }catch(Exceptione){
  65. e.printStackTrace();
  66. }finally{
  67. if(isearcher!=null){
  68. try{
  69. isearcher.close();
  70. }catch(Exceptione){
  71. e.printStackTrace();
  72. }
  73. }
  74. }
  75. returnsb.toString();
  76. }
  77. publicstaticvoidmain(String[]args){
  78. TestLuceneHighlighter2t=newTestLuceneHighlighter2();
  79. StringqueryString="中华人民共和国";
  80. intbegin=0;
  81. intnumber=10;
  82. t.test(queryString,begin,number);
  83. }
  84. }
  85. packagedemo;
  86. importjava.io.StringReader;
  87. importnet.paoding.analysis.analyzer.PaodingAnalyzer;
  88. importorg.apache.lucene.analysis.Analyzer;
  89. importorg.apache.lucene.analysis.TokenStream;
  90. importorg.apache.lucene.document.Document;
  91. importorg.apache.lucene.queryParser.QueryParser;
  92. importorg.apache.lucene.search.BooleanClause;
  93. importorg.apache.lucene.search.IndexSearcher;
  94. importorg.apache.lucene.search.Query;
  95. importorg.apache.lucene.search.ScoreDoc;
  96. importorg.apache.lucene.search.TopDocCollector;
  97. importorg.apache.lucene.search.highlight.Highlighter;
  98. importorg.apache.lucene.search.highlight.QueryScorer;
  99. importorg.apache.lucene.search.highlight.SimpleFragmenter;
  100. importorg.apache.lucene.search.highlig
  

爱华网本文地址 » http://www.413yy.cn/a/25101011/48104.html

更多阅读

Lucene+HighLighter高亮显示实例 lucene高亮实例

今天搞了一个关于Lucene的例子,权当入门教程。网上有很多资料,但是要么不全、要么不好用,所以这里把全部代码以及依赖的包贴上来了。功能包括:创建索引、检索索引、高亮显示查询结果。分词使用的庖丁解牛。使用前先下载相关的LuceneCore

SQL server存储过程语法及实例 mysql存储过程实例

存储过程如同一门程序设计语言,同样包含了数据类型、流程控制、输入和输出和它自己的函数库。--------------------基本语法--------------------一.创建存储过程create procedure sp_name()begin.........end二.调用存储过程1.基本

子网划分以及应用实例 ansys网格划分实例

本节就将介绍子网划分的有关概念和方法,主要涉及到一下几个方面的内容:(1)子网划分的概念(2)为什么要进行子网划分(3)如何进行子网划分(4)VLSM(可变长子网掩码)子网划分的概念每类IP地址都有自己的缺省子网掩码,但是这些缺省子网掩码并

声明:《Lucene+HighLighter高亮显示实例 lucene高亮实例》为网友全职保姆分享!如侵犯到您的合法权益请联系我们删除