Lucene查询索引的例子

package com.javaeye.tonybo2006.lucene.test;

import java.io.IOException;
import java.util.Date;
import org.apache.lucene.analysis.*;
import org.apache.lucene.index.*;
import org.apache.lucene.queryParser.*;
import org.apache.lucene.search.*;

/**
 * @author tonybo2006
 * 
 */
public class TextFileSearcher {
	private String indexFilePath = null;

	public TextFileSearcher(String indexFilePath) {
		this.indexFilePath = indexFilePath;
	}

	/**
	 * @return StandardAnalyzer
	 */
	private Analyzer getAnalyzer() {
		return new StandardAnalyzer();
	}

	/**
	 * TermQuery可以用“field:key”方式,例如“content:lucene”。 
	 * BooleanQuery中‘与’用‘+’,‘或’用‘-’,例如“content:java contenterl”。 
	 * WildcardQuery仍然用‘?’和‘*’,例如“content:use*”。
	 * PhraseQuery用‘~’,例如“content:"中日"~5”。 
	 * PrefixQuery用‘*’,例如“中*”。
	 * FuzzyQuery用‘~’,例如“content: wuzza ~”。
	 * RangeQuery用‘[]’或‘{}’,前者表示闭区间,后者表示开区间,例如“time:[20060101 TO 20060130]”,注意TO区分大小写。
	 * @param queryString
	 * @return
	 */
	public int queryByQueryParser(String queryString) {
		int intRecords = 0;
		IndexSearcher isearcher = null;
		try {
			isearcher = new IndexSearcher(indexFilePath);
			TopDocCollector collector = new TopDocCollector(10); // 启用这个
			QueryParser parser = new QueryParser("title",getAnalyzer());
			Query query = parser.parse("+(contents:" + queryString + ")+modified:[200811140000 TO 200811149999]");
			
			long startTime = new Date().getTime();
			System.out.println("开始查询……");
			isearcher.search(query, collector);
			// 测试一下查询的时间
			long endTime = new Date().getTime();
			
			ScoreDoc[] scoreDoc = collector.topDocs().scoreDocs; // 拿到结果
			intRecords = scoreDoc.length;
			int docId = 0;
			for (int i = 0; i < intRecords; i++) {
				docId = scoreDoc[i].doc; // 一个内部编号
				isearcher.doc(docId); // 通过编号,拿到文档
				System.out.println("第" + (i + 1) + "条数据,包含在File:"
						+ isearcher.doc(docId).get("path"));
				System.out.println("第" + (i + 1) + "条数据,修改时间:"
						+ isearcher.doc(docId).get("modified"));
			}
			
			System.out.println("查询到了" + intRecords + "条数据,花费了"
					+ (endTime - startTime) + "毫秒!");
			
		} catch (ParseException e) {
			e.printStackTrace();
		} catch (CorruptIndexException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (isearcher != null) {
				try {
					isearcher.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return intRecords;
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String indexFilePath = "D:\\index";//索引文件路径
		String queryString = "test";
		TextFileSearcher textFileSearcher = new TextFileSearcher(indexFilePath);
		textFileSearcher.queryByQueryParser(queryString);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值