lucene5.0建立索引并进行查找

说白了就是两个函数一个建立索引(写),另一个来查找(读),所以涉及到java IO的一些知识。

[java] view plaincopyprint?

  1. import java.io.*;   

  2. import java.nio.file.Paths;  

  3. import java.util.Date;   

  4. import org.apache.lucene.analysis.Analyzer;   

  5. import org.apache.lucene.analysis.standard.StandardAnalyzer;   

  6. import org.apache.lucene.document.Document;   

  7. import org.apache.lucene.document.Field;   

  8. import org.apache.lucene.document.Field.Store;  

  9. import org.apache.lucene.document.LongField;  

  10. import org.apache.lucene.document.StringField;  

  11. import org.apache.lucene.document.TextField;  

  12. import org.apache.lucene.index.*;   

  13. import org.apache.lucene.store.Directory;  

  14. import org.apache.lucene.store.FSDirectory;  

  15. /**  

  16. * This class demonstrate the process of creating index with Lucene  

  17. * for text files  

  18. */   

  19. public class TxtFileIndexer {   

  20.      public static void main(String[] args) throws Exception{   

  21.      //indexDir is the directory that hosts Lucene‘s index files   

  22.      Directory indexDir = FSDirectory.open(Paths.get("G:\\luceneout"));  

  23.      //dataDir is the directory that hosts the text files that to be indexed   

  24.      File   dataDir  = new File("G:\\downloads\\LJParser_release\\LJParser_Packet\\训练分类用文本\\交通");   

  25.      Analyzer luceneAnalyzer = new StandardAnalyzer(); //新建一个分词器实例  

  26.      IndexWriterConfig config = new IndexWriterConfig(luceneAnalyzer);  

  27.      File[] dataFiles  = dataDir.listFiles(); //所有训练样本文件  

  28.      IndexWriter indexWriter = new IndexWriter(indexDir,config);//构造一个索引写入器   

  29.      long startTime = new Date().getTime();   

  30.      for(int i = 0; i < dataFiles.length; i++){   

  31.           if(dataFiles[i].isFile() && dataFiles[i].getName().endsWith(".txt")){  

  32.                System.out.println("Indexing file " + dataFiles[i].getCanonicalPath()); //返回绝对路径  

  33.                Document document = new Document();//每一个文件都变成一个document对象   

  34.                Reader txtReader = new FileReader(dataFiles[i]);   

  35.                Field field1 = new StringField("path",dataFiles[i].getPath(),Store.YES);  

  36.                Field field2 = new TextField("content",txtReader);  

  37.                Field field3 = new LongField("fileSize", dataFiles[i].length(), Store.YES);   

  38.                Field field4 = new TextField("filename",dataFiles[i].getName(),Store.YES);  

  39.                document.add(field1);  

  40.                document.add(field2);  

  41.                document.add(field3);  

  42.                document.add(field4);  

  43.                indexWriter.addDocument(document); //写进一个索引  

  44.           }   

  45.      }   

  46.      //indexWriter.optimize();   

  47.      indexWriter.close();   

  48.      long endTime = new Date().getTime();   

  49.           

  50.      System.out.println("It takes " + (endTime - startTime)   

  51.          + " milliseconds to create index for the files in directory "  

  52.          + dataDir.getPath());          

  53.      }   

  54. }  

import java.io.*; 
import java.nio.file.Paths;
import java.util.Date; 
import org.apache.lucene.analysis.Analyzer; 
import org.apache.lucene.analysis.standard.StandardAnalyzer; 
import org.apache.lucene.document.Document; 
import org.apache.lucene.document.Field; 
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.document.LongField;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.*; 
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
/** 
* This class demonstrate the process of creating index with Lucene 
* for text files 
*/ 
public class TxtFileIndexer { 
     public static void main(String[] args) throws Exception{ 
     //indexDir is the directory that hosts Lucene‘s index files 
     Directory indexDir = FSDirectory.open(Paths.get("G:\\luceneout"));
     //dataDir is the directory that hosts the text files that to be indexed 
     File   dataDir  = new File("G:\\downloads\\LJParser_release\\LJParser_Packet\\训练分类用文本\\交通"); 
     Analyzer luceneAnalyzer = new StandardAnalyzer(); //新建一个分词器实例
     IndexWriterConfig config = new IndexWriterConfig(luceneAnalyzer);
     File[] dataFiles  = dataDir.listFiles(); //所有训练样本文件
     IndexWriter indexWriter = new IndexWriter(indexDir,config);//构造一个索引写入器 
     long startTime = new Date().getTime(); 
     for(int i = 0; i < dataFiles.length; i++){ 
          if(dataFiles[i].isFile() && dataFiles[i].getName().endsWith(".txt")){
               System.out.println("Indexing file " + dataFiles[i].getCanonicalPath()); //返回绝对路径
               Document document = new Document();//每一个文件都变成一个document对象 
               Reader txtReader = new FileReader(dataFiles[i]); 
               Field field1 = new StringField("path",dataFiles[i].getPath(),Store.YES);
               Field field2 = new TextField("content",txtReader);
               Field field3 = new LongField("fileSize", dataFiles[i].length(), Store.YES); 
               Field field4 = new TextField("filename",dataFiles[i].getName(),Store.YES);
               document.add(field1);
               document.add(field2);
               document.add(field3);
               document.add(field4);
               indexWriter.addDocument(document); //写进一个索引
          } 
     } 
     //indexWriter.optimize(); 
     indexWriter.close(); 
     long endTime = new Date().getTime(); 
        
     System.out.println("It takes " + (endTime - startTime) 
         + " milliseconds to create index for the files in directory "
         + dataDir.getPath());        
     } 
}

读取索引并查找

[java] view plaincopyprint?

  1. import java.io.File;   

  2. import java.nio.file.Paths;  

  3.   

  4. import org.apache.lucene.analysis.standard.StandardAnalyzer;  

  5. import org.apache.lucene.document.Document;   

  6. import org.apache.lucene.index.DirectoryReader;    

  7. import org.apache.lucene.queryparser.classic.QueryParser;  

  8. import org.apache.lucene.search.*;   

  9. import org.apache.lucene.store.*;  

  10.  /**  

  11.  * This class is used to demonstrate the  

  12.  * process of searching on an existing  

  13.  * Lucene index  

  14.  *  

  15.  */   

  16.  public class TxtFileSearcher {   

  17.      public static void main(String[] args) throws Exception{   

  18.          //存储了索引文件  

  19.          Directory indexDir = FSDirectory.open(Paths.get("G:\\luceneout"));  

  20.          //读取器读取索引文件  

  21.          DirectoryReader ireader = DirectoryReader.open(indexDir);  

  22.          //查找  

  23.          IndexSearcher searcher = new IndexSearcher(ireader);  

  24.          //目的查找字符串  

  25.          String queryStr = "大数据挖掘";  

  26.          //构造一个词法分析器,并将查询结果返回到一个队列  

  27.          QueryParser parser = new QueryParser("content",new StandardAnalyzer());  

  28.          Query query = parser.parse(queryStr);  

  29.          TopDocs docs = searcher.search(query, 100);  

  30.          System.out.print("一共搜索到结果:"+docs.totalHits+"条");  

  31.          //输出查询结果信息  

  32.          for(ScoreDoc scoreDoc:docs.scoreDocs){  

  33.              System.out.print("序号为:"+scoreDoc.doc);  

  34.              System.out.print("评分为:"+scoreDoc.score);  

  35.              Document document = searcher.doc(scoreDoc.doc);  

  36.              System.out.print("路径为:"+document.get("path"));  

  37.              System.out.print("内容为"+document.get("content"));  

  38.              System.out.print("文件大小为"+document.get("fileSize"));  

  39.              System.out.print("文件名为"+document.get("filename"));  

  40.              System.out.println();  

  41.          }     

  42.      }   

  43.  }  

import java.io.File; 
import java.nio.file.Paths;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document; 
import org.apache.lucene.index.DirectoryReader;  
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.*; 
import org.apache.lucene.store.*;
 /** 
 * This class is used to demonstrate the 
 * process of searching on an existing 
 * Lucene index 
 * 
 */ 
 public class TxtFileSearcher { 
	 public static void main(String[] args) throws Exception{ 
		 //存储了索引文件
		 Directory indexDir = FSDirectory.open(Paths.get("G:\\luceneout"));
		 //读取器读取索引文件
		 DirectoryReader ireader = DirectoryReader.open(indexDir);
		 //查找
		 IndexSearcher searcher = new IndexSearcher(ireader);
		 //目的查找字符串
		 String queryStr = "大数据挖掘";
		 //构造一个词法分析器,并将查询结果返回到一个队列
		 QueryParser parser = new QueryParser("content",new StandardAnalyzer());
		 Query query = parser.parse(queryStr);
		 TopDocs docs = searcher.search(query, 100);
		 System.out.print("一共搜索到结果:"+docs.totalHits+"条");
		 //输出查询结果信息
		 for(ScoreDoc scoreDoc:docs.scoreDocs){
			 System.out.print("序号为:"+scoreDoc.doc);
			 System.out.print("评分为:"+scoreDoc.score);
			 Document document = searcher.doc(scoreDoc.doc);
			 System.out.print("路径为:"+document.get("path"));
			 System.out.print("内容为"+document.get("content"));
			 System.out.print("文件大小为"+document.get("fileSize"));
			 System.out.print("文件名为"+document.get("filename"));
			 System.out.println();
		 }	 
	 } 
 }

技术分享

运行结果

下面是文件目录

技术分享

两个函数都需要用到分词器,前者是为了配置写入,后者则是为了配置词法分析器来查找


本文出自 “ssh互联与hadoop搭建” 博客,请务必保留此出处http://8492887.blog.51cto.com/8482887/1637187

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。