欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Lucene查询索引的例子

程序员文章站 2022-07-09 09:33:54
...
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);
	}
}

相关标签: lucene Apache