`

【转】lucene3.0入门实例

阅读更多
转自:http://cumtfirefly.iteye.com/blog/543664
lucene3.0已于2009-11-25发布啦,但网上的入门实例都是针对lucene3.0以前的,相对于以前的版本,貌似改动不小。
本人从头开始学习lucene,现在用的是《lucene in action中文版》,结合lucene3.0文档写了个入门实例,可供像我一样直接从lucene3.0开始学习的新手参考!


入门实例:

1.预处理:先把网上下载的一个《三国演义》电子书“三国演义.txt”(可用其他代替,呵呵)切割成多个小文件。

Java代码 复制代码
  1. /**  
  2.  * @author ht  
  3.  * 预处理  
  4.  *  
  5.  */  
  6. public class FilePreprocess {   
  7.    public static void main(String[] arg){   
  8.     String outputpath = "D:\\test\\small\\";//小文件存放路径   
  9.     String filename = "D:\\test\\三国演义.txt";//原文件存放路径   
  10.     if(!new File(outputpath).exists()){   
  11.         new File(outputpath).mkdirs();   
  12.     }   
  13.     splitToSmallFiles(new File(filename), outputpath);   
  14.    }   
  15. /**大文件切割为小的  
  16.  * @param file  
  17.  * @param outputpath  
  18.  */  
  19.    public static void splitToSmallFiles(File file ,String outputpath){   
  20.         int filePointer = 0;   
  21.     int MAX_SIZE = 10240;   
  22.     String filename = "output";   
  23.   
  24.     BufferedWriter writer = null;   
  25.     try {   
  26.         BufferedReader reader = new BufferedReader(new FileReader(file));   
  27.         StringBuffer buffer = new StringBuffer();   
  28.         String line = reader.readLine();   
  29.         while(line != null){   
  30.             buffer.append(line).append("\r\n");   
  31.             if(buffer.toString().getBytes().length>=MAX_SIZE){   
  32.                 writer = new BufferedWriter(new  FileWriter(outputpath+filename+filePointer+".txt"));   
  33.                 writer.write(buffer.toString());   
  34.                 writer.close();   
  35.                 filePointer++;   
  36.                 buffer=new StringBuffer();   
  37.             }   
  38.             line = reader.readLine();                  
  39.         }   
  40.         writer = new BufferedWriter(new FileWriter(outputpath+filename+filePointer+".txt"));   
  41.         writer.write(buffer.toString());   
  42.         writer.close();   
  43.         System.out.println("The file hava splited to small files !");   
  44.     } catch (FileNotFoundException e) {   
  45.         System.out.println("file not found !");   
  46.     e.printStackTrace();   
  47.     } catch (IOException e) {   
  48.         e.printStackTrace();   
  49.     }          
  50. }  
/**
 * @author ht
 * 预处理
 *
 */
public class FilePreprocess {
   public static void main(String[] arg){
	String outputpath = "D:\\test\\small\\";//小文件存放路径
	String filename = "D:\\test\\三国演义.txt";//原文件存放路径
	if(!new File(outputpath).exists()){
		new File(outputpath).mkdirs();
	}
	splitToSmallFiles(new File(filename), outputpath);
   }
/**大文件切割为小的
 * @param file
 * @param outputpath
 */
   public static void splitToSmallFiles(File file ,String outputpath){
        int filePointer = 0;
	int MAX_SIZE = 10240;
	String filename = "output";

	BufferedWriter writer = null;
	try {
		BufferedReader reader = new BufferedReader(new FileReader(file));
		StringBuffer buffer = new StringBuffer();
		String line = reader.readLine();
		while(line != null){
			buffer.append(line).append("\r\n");
			if(buffer.toString().getBytes().length>=MAX_SIZE){
				writer = new BufferedWriter(new  FileWriter(outputpath+filename+filePointer+".txt"));
				writer.write(buffer.toString());
				writer.close();
				filePointer++;
				buffer=new StringBuffer();
			}
			line = reader.readLine();				
		}
		writer = new BufferedWriter(new FileWriter(outputpath+filename+filePointer+".txt"));
		writer.write(buffer.toString());
		writer.close();
		System.out.println("The file hava splited to small files !");
	} catch (FileNotFoundException e) {
		System.out.println("file not found !");
	e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	}		
}


2.用lucene3.0生成索引类:用lencene3.0对生成的多个小文件进行索引,中文分词用的是lucene3.0自带的StandardAnalyzer.

Java代码 复制代码
  1. /**  
  2.  * @author ht  
  3.  * 索引生成  
  4.  *  
  5.  */  
  6. public class Indexer {   
  7.    private static String INDEX_DIR = "D:\\test\\index";//索引存放目录   
  8.    private static String DATA_DIR = "D:\\test\\small\\";//小文件存放的目录   
  9.        
  10.   public static void main(String[] args) throws Exception {   
  11.     
  12.     long start = new Date().getTime();   
  13.     int numIndexed = index(new File(INDEX_DIR), new File(DATA_DIR));//调用index方法   
  14.     long end = new Date().getTime();   
  15.     System.out.println("Indexing " + numIndexed + " files took " + (end - start) + " milliseconds");   
  16.   }   
  17.   
  18.   /**索引dataDir下的.txt文件,并储存在indexDir下,返回索引的文件数量  
  19.  * @param indexDir  
  20.  * @param dataDir  
  21.  * @return int   
  22.  * @throws IOException  
  23.  */  
  24. public static int index(File indexDir, File dataDir) throws IOException {   
  25.   
  26.     if (!dataDir.exists() || !dataDir.isDirectory()) {   
  27.       throw new IOException(dataDir + " does not exist or is not a directory");   
  28.     }   
  29.   
  30.     IndexWriter writer = new IndexWriter(FSDirectory.open(indexDir), new StandardAnalyzer(Version.LUCENE_CURRENT), true,    
  31. IndexWriter.MaxFieldLength.LIMITED);//有变化的地方   
  32.        
  33.     indexDirectory(writer, dataDir);   
  34.     int numIndexed = writer.numDocs();   
  35.     writer.optimize();   
  36.     writer.close();   
  37.     return numIndexed;   
  38.   }   
  39.   
  40.   /**循环遍历目录下的所有.txt文件并进行索引  
  41.  * @param writer  
  42.  * @param dir  
  43.  * @throws IOException  
  44.  */  
  45. private static void indexDirectory(IndexWriter writer, File dir)   
  46.     throws IOException {   
  47.   
  48.     File[] files = dir.listFiles();   
  49.   
  50.     for (int i = 0; i < files.length; i++) {   
  51.       File f = files[i];   
  52.       if (f.isDirectory()) {   
  53.         indexDirectory(writer, f);  // recurse   
  54.       } else if (f.getName().endsWith(".txt")) {   
  55.         indexFile(writer, f);   
  56.       }   
  57.     }   
  58.   }   
  59.   
  60.   /**对单个txt文件进行索引  
  61.  * @param writer  
  62.  * @param f  
  63.  * @throws IOException  
  64.  */  
  65. private static void indexFile(IndexWriter writer, File f)   
  66.     throws IOException {   
  67.        
  68.     if (f.isHidden() || !f.exists() || !f.canRead()) {   
  69.       return;   
  70.     }   
  71.   
  72.     System.out.println("Indexing " + f.getCanonicalPath());   
  73.     Document doc = new Document();   
  74.     doc.add(new Field("contents",new FileReader(f)));//有变化的地方   
  75.     doc.add(new Field("filename",f.getCanonicalPath(),Field.Store.YES, Field.Index.ANALYZED));//有变化的地方   
  76.     
  77.     writer.addDocument(doc);   
  78.   }   
  79. }  
/**
 * @author ht
 * 索引生成
 *
 */
public class Indexer {
   private static String INDEX_DIR = "D:\\test\\index";//索引存放目录
   private static String DATA_DIR = "D:\\test\\small\\";//小文件存放的目录
	
  public static void main(String[] args) throws Exception {
 
    long start = new Date().getTime();
    int numIndexed = index(new File(INDEX_DIR), new File(DATA_DIR));//调用index方法
    long end = new Date().getTime();
    System.out.println("Indexing " + numIndexed + " files took " + (end - start) + " milliseconds");
  }

  /**索引dataDir下的.txt文件,并储存在indexDir下,返回索引的文件数量
 * @param indexDir
 * @param dataDir
 * @return int 
 * @throws IOException
 */
public static int index(File indexDir, File dataDir) throws IOException {

    if (!dataDir.exists() || !dataDir.isDirectory()) {
      throw new IOException(dataDir + " does not exist or is not a directory");
    }

    IndexWriter writer = new IndexWriter(FSDirectory.open(indexDir), new StandardAnalyzer(Version.LUCENE_CURRENT), true, 
IndexWriter.MaxFieldLength.LIMITED);//有变化的地方
    
    indexDirectory(writer, dataDir);
    int numIndexed = writer.numDocs();
    writer.optimize();
    writer.close();
    return numIndexed;
  }

  /**循环遍历目录下的所有.txt文件并进行索引
 * @param writer
 * @param dir
 * @throws IOException
 */
private static void indexDirectory(IndexWriter writer, File dir)
    throws IOException {

    File[] files = dir.listFiles();

    for (int i = 0; i < files.length; i++) {
      File f = files[i];
      if (f.isDirectory()) {
        indexDirectory(writer, f);  // recurse
      } else if (f.getName().endsWith(".txt")) {
        indexFile(writer, f);
      }
    }
  }

  /**对单个txt文件进行索引
 * @param writer
 * @param f
 * @throws IOException
 */
private static void indexFile(IndexWriter writer, File f)
    throws IOException {
	
    if (f.isHidden() || !f.exists() || !f.canRead()) {
      return;
    }

    System.out.println("Indexing " + f.getCanonicalPath());
    Document doc = new Document();
    doc.add(new Field("contents",new FileReader(f)));//有变化的地方
    doc.add(new Field("filename",f.getCanonicalPath(),Field.Store.YES, Field.Index.ANALYZED));//有变化的地方
 
    writer.addDocument(doc);
  }
}


3.查询类:查询“玄德”!

Java代码 复制代码
  1. /**  
  2.  * @author ht  
  3.  * 查询  
  4.  *  
  5.  */  
  6. public class Searcher {   
  7.    private static String INDEX_DIR = "D:\\test\\index\\";//索引所在的路径   
  8.    private static String KEYWORD = "玄德";//关键词   
  9.    private static int TOP_NUM = 100;//显示前100条结果   
  10.        
  11.   public static void main(String[] args) throws Exception {   
  12.     File indexDir = new File(INDEX_DIR);   
  13.     if (!indexDir.exists() || !indexDir.isDirectory()) {   
  14.       throw new Exception(indexDir +   
  15.         " does not exist or is not a directory.");   
  16.     }   
  17.     search(indexDir, KEYWORD);//调用search方法进行查询   
  18.   }   
  19. /**查询  
  20.  * @param indexDir  
  21.  * @param q  
  22.  * @throws Exception  
  23.  */  
  24.   public static void search(File indexDir, String q) throws Exception {   
  25.     IndexSearcher is = new  IndexSearcher(FSDirectory.open(indexDir),true);//read-only   
  26.     String field = "contents";   
  27.        
  28.     QueryParser parser = new QueryParser(Version.LUCENE_CURRENT, field, new StandardAnalyzer(Version.LUCENE_CURRENT));//有变化的地方   
  29.     Query query = parser.parse(q);   
  30.   
  31.     TopScoreDocCollector collector = TopScoreDocCollector.create(TOP_NUM , false);//有变化的地方   
  32.        
  33.     long start = new Date().getTime();// start time   
  34.        
  35.     is.search(query, collector);   
  36.     ScoreDoc[] hits = collector.topDocs().scoreDocs;   
  37.   
  38.     System.out.println(hits.length);   
  39.     for (int i = 0; i < hits.length; i++) {   
  40.         Document doc = is.doc(hits[i].doc);//new method is.doc()   
  41.         System.out.println(doc.getField("filename")+"   "+hits[i].toString()+"  ");   
  42.     }   
  43.     long end = new Date().getTime();//end time   
  44.   
  45.     System.out.println("Found " + collector.getTotalHits() +   
  46.               " document(s) (in " + (end - start) +   
  47.               " milliseconds) that matched query '" +   
  48.                 q + "':");   
  49.   }   
  50. }  
/**
 * @author ht
 * 查询
 *
 */
public class Searcher {
   private static String INDEX_DIR = "D:\\test\\index\\";//索引所在的路径
   private static String KEYWORD = "玄德";//关键词
   private static int TOP_NUM = 100;//显示前100条结果
	
  public static void main(String[] args) throws Exception {
	File indexDir = new File(INDEX_DIR);
    if (!indexDir.exists() || !indexDir.isDirectory()) {
      throw new Exception(indexDir +
        " does not exist or is not a directory.");
    }
    search(indexDir, KEYWORD);//调用search方法进行查询
  }
/**查询
 * @param indexDir
 * @param q
 * @throws Exception
 */
  public static void search(File indexDir, String q) throws Exception {
    IndexSearcher is = new  IndexSearcher(FSDirectory.open(indexDir),true);//read-only
    String field = "contents";
    
    QueryParser parser = new QueryParser(Version.LUCENE_CURRENT, field, new StandardAnalyzer(Version.LUCENE_CURRENT));//有变化的地方
    Query query = parser.parse(q);

    TopScoreDocCollector collector = TopScoreDocCollector.create(TOP_NUM , false);//有变化的地方
    
    long start = new Date().getTime();// start time
    
    is.search(query, collector);
    ScoreDoc[] hits = collector.topDocs().scoreDocs;

    System.out.println(hits.length);
    for (int i = 0; i < hits.length; i++) {
    	Document doc = is.doc(hits[i].doc);//new method is.doc()
    	System.out.println(doc.getField("filename")+"   "+hits[i].toString()+"  ");
	}
    long end = new Date().getTime();//end time

    System.out.println("Found " + collector.getTotalHits() +
    	      " document(s) (in " + (end - start) +
    	      " milliseconds) that matched query '" +
    	        q + "':");
  }
}


4.结果就不贴啦,反正能运行就是啦
分享到:
评论
1 楼 libingyang 2010-05-11  
很好很强大

相关推荐

    lucene 3.0 入门实例

    **Lucene 3.0 入门实例** Lucene 是一个高性能、全文本搜索库,由 Apache 软件基金会开发。它提供了完整的搜索功能,包括索引、查询解析、排序以及高级的文本分析能力。在 Lucene 3.0 版本中,开发者可以利用其强大...

    Lucene3.0入门实例含jar包

    **Lucene 3.0 入门实例及关键知识点** Lucene 是一个开源的全文搜索引擎库,由 Apache 软件基金会开发。它为开发者提供了在应用程序中实现文本搜索功能的强大工具。本实例主要针对 Lucene 3.0 版本,这个版本虽然...

    Apache Lucene3.0 入门实例介绍

    这个入门实例将引导我们了解如何使用Lucene 3.0版本进行基本的索引和搜索操作。以下是对Lucene 3.0关键知识点的详细讲解: 1. **Lucene的架构**: Lucene的核心组件包括文档(Document)、字段(Field)、索引...

    lucene3.0全文检索入门实例

    **Lucene 3.0 全文检索入门实例** Lucene 是一个开源的全文检索库,由 Apache 软件基金会开发。它提供了一个高级、灵活的搜索功能框架,允许开发者在自己的应用中轻松地集成全文检索功能。本文将重点介绍如何使用 ...

    Lucene 3.0完成入门

    《Lucene 3.0 完成入门》 Lucene 是一个开源的全文检索库,由 Apache 软件基金会维护。它为开发者提供了一种高级的文本搜索功能,允许他们在应用程序中集成强大的搜索引擎。本篇文章将围绕 Lucene 3.0 版本,详细...

    Lucene3.0 使 用 教 程

    【Lucene3.0 使用教程】是针对Java开发者的一个指南,旨在教授如何利用Apache Lucene 3.0.1版本实现全文检索功能。Lucene是一个高性能、可伸缩的开源全文检索库,它提供了文本分析、索引创建、文档检索等核心功能。...

    lucene3.0入门

    《Lucene 3.0 入门:搜索引擎开发的基础指南》 Lucene 是一个高性能、全文本搜索库,由 Apache 软件基金会维护。它为开发者提供了在各种应用程序中实现全文索引和搜索功能的强大工具。Lucene 3.0 版本是其历史上的...

    Lucene的IK Analyzer 3.0 中文分词器 全解

    自2006年12月发布1.0版以来,IK Analyzer 经历了多次升级,3.0版已演变为独立于 Lucene 的通用分词组件,同时也为 Lucene 提供了优化的集成。 1. **IK Analyzer 3.0 结构设计** - IK Analyzer 3.0 的设计旨在提高...

    全文搜索引擎lucene入门

    **全文搜索引擎Lucene入门** 全文搜索引擎Lucene是Apache软件基金会的一个开放源代码项目,它为Java开发者提供了一个高性能、可扩展的信息检索库。Lucene以其强大的文本搜索功能和高效的索引能力,在各种需要全文...

    IKAnalyzer中文分词好帮手

    ##### 2.3 Lucene用户快速入门 对于使用Lucene的开发者来说,IKAnalyzer提供了简便的集成方式。下面是一个简单的代码示例,展示了如何使用IKAnalyzer进行文本分词: ```java public class IKAnalyzerDemo { ...

    IKAnalyzer中文分词器

    ##### Lucene用户快速入门 对于Lucene用户而言,使用IKAnalyzer进行分词操作可以通过以下步骤实现: 1. 导入必要的包,例如`Analyzer`、`Document`、`Field`、`IndexWriter`、`IndexSearcher`、`Query`等。 2. ...

    java核心技术

    - **EJB**:如《Enterprise JavaBeans 3.0》(第五版),深入讲解EJB,适用于大规模分布式系统开发。 **搜索技术** - **《Lucene in action》**:经典之作,介绍了Lucene的基本原理,虽版本较低但仍具有参考价值。 ...

    JAVA书目学习

    - **简介**:本书深入介绍了面向对象编程的核心概念,并提供了大量实例来帮助读者理解和掌握Java编程。 - **适用人群**:适合已有一定Java基础的学习者,用于加深对Java编程的理解。 3. **《Java JDK实例宝典》**...

Global site tag (gtag.js) - Google Analytics