LuceneIndexLocalDisk.java
上传用户:cctqzzy
上传日期:2022-03-14
资源大小:12198k
文件大小:4k
源码类别:

搜索引擎

开发平台:

Java

  1. package chapter5;
  2. import java.io.IOException;
  3. import java.io.File;
  4. import java.io.FileReader;
  5. import org.apache.lucene.store.Directory; 
  6. import org.apache.lucene.store.RAMDirectory;
  7. import org.apache.lucene.document.Field;
  8. import org.apache.lucene.document.Document;
  9. import org.apache.lucene.index.IndexWriter;
  10. import org.apache.lucene.analysis.standard.StandardAnalyzer;
  11. /*******************************************************************
  12.  * 本代码完成本地指定目录的遍历和文件查找。对指定后缀的文件进行分析,利用Lucene建立
  13.  * 索引,为后续检索使用做好准备。
  14.  *******************************************************************/
  15. public class LuceneIndexLocalDisk {
  16. private static String Dest_Index_Path = "D:\workshop\TextIndex";
  17. private static String Text_File_Path  = "D:\workshop\ch2\002\";
  18. /*========================================================
  19.  * 主函数,指定索引目录和待分析的目录,生成Lucene索引
  20.  *========================================================*/
  21. public static void main(String[] args) {
  22. File indexpath = new File(Dest_Index_Path);
  23. File localPath = new File(Text_File_Path);
  24. try {
  25. int nums = indexBuilder(indexpath,localPath);
  26. System.out.println("Index Finished " + nums + "  docs");
  27. } catch (IOException e) {
  28. e.printStackTrace();
  29. }
  30. }
  31. /*========================================================
  32.  * 索引创建函数,生成IndexWriter创建索引,调用子目录索引函数,并优化
  33.  * 存储本地磁盘索引
  34.  *========================================================*/
  35. public static int indexBuilder( File indexPath , File localPath ) 
  36. throws IOException{
  37. if(!localPath.exists() || !localPath.isDirectory() || !localPath.canRead()){
  38. throw new IOException(localPath + "不存在或者不允许访问" );
  39. }
  40. System.out.println("目标路径完好");
  41. IndexWriter FSWriter = new IndexWriter(indexPath,new StandardAnalyzer(),true);
  42. FSWriter.setUseCompoundFile(true);
  43. SubindexBuilder(FSWriter,localPath);
  44. int num =  FSWriter.docCount();
  45. FSWriter.optimize();
  46. FSWriter.close();
  47. return num;
  48. }
  49. /*========================================================
  50.  * 递归函数,递归分析目录,如果找到子目录,继续递归;如果找到文件分析索引
  51.  *========================================================*/
  52. private static void  SubindexBuilder(IndexWriter fswriter,File subPath)  
  53. throws IOException{
  54. File[] filelist = subPath.listFiles();
  55. System.out.println(subPath.getAbsolutePath() + "路径个数 " + filelist.length);
  56. for(int i = 0; i< filelist.length;i++){
  57. File file = filelist[i];
  58. if(file.isDirectory()){
  59. SubindexBuilder(fswriter,file);
  60. } else if(IsValidType(file.getName())){
  61. fileindexBuilder(fswriter,file);
  62. }
  63. }
  64. }
  65. /*========================================================
  66.  * 创建RAM内存索引,生成并添新文档。合并到本地磁盘索引当中
  67.  *========================================================*/
  68. private static void  fileindexBuilder(IndexWriter fswriter,File subfile)  
  69. throws IOException{
  70. if( subfile.isHidden() || !subfile.exists() || !subfile.canRead()){
  71. return ;
  72. }
  73. Directory ramdirectory = new RAMDirectory();
  74. IndexWriter RAMWriter = new IndexWriter(ramdirectory,new StandardAnalyzer(),true);
  75. // File file = new File(subfile);
  76.         FileReader fpReader = new FileReader(subfile);
  77. System.out.println("创建索引" + subfile.getCanonicalPath());
  78. Document document = new Document();
  79. Field field_name = new Field("name", subfile.getName(), 
  80. Field.Store.YES,Field.Index.UN_TOKENIZED);
  81. document.add(field_name);
  82. Field field_path = new Field("path", subfile.getAbsolutePath(), 
  83. Field.Store.YES,Field.Index.UN_TOKENIZED);
  84. document.add(field_path);
  85. Field field_content = new Field("content", fpReader);
  86. document.add(field_content);
  87. RAMWriter.addDocument(document);
  88. RAMWriter.close();
  89. fswriter.addIndexes(new Directory[]{ramdirectory});
  90. }
  91. /*========================================================
  92.  * 判断当前文件名是否符合文件后缀要求
  93.  *========================================================*/
  94. private static boolean IsValidType(String name){
  95. if(name.endsWith(".txt") || name.endsWith(".html")|| name.endsWith(".ini") ||name.endsWith(".conf")){
  96. return true;
  97. } else {
  98. return false;
  99. }
  100. }
  101. }