lucene初体验

对照着lucene官方DEMO做了个例子,自己简化了一下:
我用的是lucene-2.2.0
首先产生索引文件:
IndexFile

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Date;

/** Index all text files under a directory. */
public class IndexFiles {
  
  private IndexFiles() {}
//索引文件存放的目录
  static final File INDEX_DIR = new File("D://luceneindex");
  
  /** Index all text files under a directory. */
  public static void main(String[] args) {   
	//被索引的文件存放的目录,可以在这个目录里放一些文本文件.
    final File docDir = new File("D://lucenedata");
    if (!docDir.exists() || !docDir.canRead()) {
      System.out.println("Document directory '" +docDir.getAbsolutePath()+
    		  "' does not exist or is not readable, please check the path");
      System.exit(1);
    }
    
    Date start = new Date();
    try {
    /*
     * 这个类作用是产生索引的,构造函数有三个参数,第一个参数INDEX_DIR是所产生的索引文件存放的目录,
     * 第二个参数是一个分析器,第三个参数是意思是新建索引.
     * */
      IndexWriter writer = new IndexWriter(INDEX_DIR, new StandardAnalyzer(), true);
      System.out.println("Indexing to directory '" +INDEX_DIR+ "'...");
      indexDocs(writer, docDir);
      System.out.println("Optimizing...");
      writer.optimize();//
      writer.close();

      Date end = new Date();
      System.out.println(end.getTime() - start.getTime() + " total milliseconds");

    } catch (IOException e) {
      System.out.println(" caught a " + e.getClass() +
       "\n with message: " + e.getMessage());
    }
  }

  static void indexDocs(IndexWriter writer, File file)
    throws IOException {
    // do not try to index files that cannot be read
    if (file.canRead()) {
      if (file.isDirectory()) {
        String[] files = file.list();
        // an IO error could occur
        if (files != null) {
          for (int i = 0; i < files.length; i++) {
            indexDocs(writer, new File(file, files[i]));
          }
        }
      } else {
        System.out.println("adding " + file);
        try {
          writer.addDocument(FileDocument.Document(file));//添加被索引的文本文件
             
        
        }
        // at least on windows, some temporary files raise this exception with an "access denied" message
        // checking if the file can be read doesn't help
        catch (FileNotFoundException fnfe) {
          ;
        }
      }
    }
  }
  
}
 SearchFiles这个文件利用所产生的索引文件进行搜索:

 

 
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.FilterIndexReader;
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.Searcher;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Date;

public class SearchFiles {	
	public static void main(String[] args) throws Exception {
		String index = "D://luceneindex";
		String field = "contents";
		IndexReader reader = IndexReader.open(index);
		Searcher searcher = new IndexSearcher(reader);
		Analyzer analyzer = new StandardAnalyzer();
		BufferedReader in = null;
		in = new BufferedReader(new InputStreamReader(System.in, "UTF-8"));
		QueryParser parser = new QueryParser(field, analyzer);
		System.out.println("");
		while (true) {
			System.out.println("Enter query: ");
			String line = in.readLine();
			if (line == null || line.length() == -1)
				break;
			line = line.trim();
			if (line.length() == 0)
				break;
			Query query = parser.parse(line);
			System.out.println("Searching for: " + query.toString(field));
			Hits hits = searcher.search(query);
			System.out.println(hits.length() + " total matching documents");
			final int HITS_PER_PAGE = 10;
			for (int start = 0; start < hits.length(); start += HITS_PER_PAGE) {
				int end = Math.min(hits.length(), start + HITS_PER_PAGE);
				for (int i = start; i < end; i++) {
					Document doc = hits.doc(i);
					String path = doc.get("path");
					if (path != null) {
						System.out.println((i + 1) + ". " + path);
						System.out.println("modify time :"
								+ doc.get("modified"));
						String title = doc.get("title");
						if (title != null) {
							System.out.println("   Title: " + doc.get("title"));
						}
					} else {
						System.out.println((i + 1) + ". "
								+ "No path for this document");
					}
				}
				if (hits.length() > end) {
					System.out.println("more (y/n) ? ");
					line = in.readLine();
					if (line.length() == 0 || line.charAt(0) == 'n')
						break;
				}
			}
		}
		reader.close();
	}
}
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值