lucene学习笔记三(查询)

...省略索引创建的步骤,如果不懂请看http://my.oschina.net/kkrgwbj/blog/513329 

lucene提供的查询方式有很多,api中列出的几种查询方式如下图:

lucene学习笔记三(查询)_第1张图片

在这里,我只简简单单的举例以下几种查询

创建Directory,IndexSearcher

package com.kkrgwbj.index;

import java.io.File;
import java.io.IOException;
import java.util.Calendar;

import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TermRangeQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.BytesRef;

public class SearchUtil {
	private Directory directory;
	private IndexReader indexReader;

	public SearchUtil() {
		try {
			directory = FSDirectory.open(new File("D:/workspace/lucene/index02").toPath());
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 创建IndexSearcher
	 * 
	 * @return
	 */
	public IndexSearcher getSearcher() {
		if (indexReader == null) {
			try {
				indexReader = DirectoryReader.open(directory);
			} catch (IOException e) {
				e.printStackTrace();
			}
		} else {
			try {
				IndexReader tr = DirectoryReader.openIfChanged((DirectoryReader) indexReader);
				if (tr != null) {
					indexReader.close();
					indexReader = tr;
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return new IndexSearcher(indexReader);
	}

 固定的term查询

/**
	 * 根据固定的term查询
	 * 
	 * @param field
	 * @param name
	 */
	public void searchByTerm(String field, String name) {
		// 创建IndexSearch
		IndexSearcher indexSearcher = getSearcher();
		Query query = new TermQuery(new Term(field, name));
		try {
			TopDocs tds = indexSearcher.search(query, 10);
			System.out.println("一共查询了:" + tds.totalHits);
			for (ScoreDoc item : tds.scoreDocs) {
				Document doc = indexSearcher.doc(item.doc);
				Calendar cal = Calendar.getInstance();
				cal.setTimeInMillis(Long.valueOf(doc.get("date")));
				System.out.println("名字:" + doc.get("name") + "邮箱:" + doc.get("email") + "id:" + doc.get("id") + "附件个数:"
						+ doc.get("attach") + "日期:" + cal.getTime().toString());
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (indexReader != null)
				try {
					indexReader.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
		}
	}

term范围查询

/**
	 * 范围查询
	 * 
	 * @param field
	 *            查询的域
	 * @param start
	 *            查询的开始
	 * @param end
	 *            查询的结束
	 * @param num
	 *            返回的行数
	 */
	public void searchByTermRange(String field, String start, String end, int num) {
		IndexSearcher indexSearcher = getSearcher();
		Query query = new TermRangeQuery(field, new BytesRef(start), new BytesRef(end), true, true);
		try {
			TopDocs tds = indexSearcher.search(query, 10);
			System.out.println("一共查询了:" + tds.totalHits);
			for (ScoreDoc item : tds.scoreDocs) {
				Document doc = indexSearcher.doc(item.doc);
				Calendar cal = Calendar.getInstance();
				cal.setTimeInMillis(Long.valueOf(doc.get("date")));
				System.out.println("名字:" + doc.get("name") + "邮箱:" + doc.get("email") + "id:" + doc.get("id") + "附件个数:"
						+ doc.get("attach") + "日期:" + cal.getTime().toString());
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (indexReader != null)
				try {
					indexReader.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
		}
	}

数字范围的查询

	/**
	 * 数字范围的查询
	 * @param field
	 * @param start
	 * @param end
	 * @param num
	 */
	public void searchByNumericRange(String field,int start,int end,int num){
		IndexSearcher indexSearcher = getSearcher();
		Query query = NumericRangeQuery.newIntRange(field, start, end,true,true);
		try {
			TopDocs tds = indexSearcher.search(query, 10);
			System.out.println("一共查询了:" + tds.totalHits);
			for (ScoreDoc item : tds.scoreDocs) {
				Document doc = indexSearcher.doc(item.doc);
				Calendar cal = Calendar.getInstance();
				cal.setTimeInMillis(Long.valueOf(doc.get("date")));
				System.out.println("名字:" + doc.get("name") + "邮箱:" + doc.get("email") + "id:" + doc.get("id") + "附件个数:"
						+ doc.get("attach") + "日期:" + cal.getTime().toString());
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (indexReader != null)
				try {
					indexReader.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
		}
	}

前缀查询

	/**
	 * 前缀搜索
	 * @param field
	 * @param value
	 * @param num
	 */
	public void searchByPrefix(String field,String value,int num){
		IndexSearcher indexSearcher = getSearcher();
		Query query = new PrefixQuery(new Term(field, value));
		try {
			TopDocs tds = indexSearcher.search(query, 10);
			System.out.println("一共查询了:" + tds.totalHits);
			for (ScoreDoc item : tds.scoreDocs) {
				Document doc = indexSearcher.doc(item.doc);
				Calendar cal = Calendar.getInstance();
				cal.setTimeInMillis(Long.valueOf(doc.get("date")));
				System.out.println("名字:" + doc.get("name") + "邮箱:" + doc.get("email") + "id:" + doc.get("id") + "附件个数:"
						+ doc.get("attach") + "日期:" + cal.getTime().toString());
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (indexReader != null)
				try {
					indexReader.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
		}
	}

连接多个子查询:

public void searchByBoolean(int num) {
		IndexSearcher indexSearcher = getSearcher();
		BooleanQuery.Builder booleanBuild = new BooleanQuery.Builder();
		// 名字中含有mick,并且内容含有game的
		/**
		 * BooleanQuery可以连接多个子查询
		 * Occur.MUST:必须出现(相当于数据库的and)
		 * Occur.SHOULD:表示可以出现(相当于数据库的or)
		 * Occur.MUSTNOT:不能出现(相当于数据库的not)
		 */
		booleanBuild.add(new TermQuery(new Term("name", "mick")), Occur.MUST);
		booleanBuild.add(new TermQuery(new Term("content", "game")), Occur.MUST);
		BooleanQuery booleanQuery = booleanBuild.build();
		try {
			TopDocs tds = indexSearcher.search(booleanQuery, 10);
			System.out.println("一共查询了:" + tds.totalHits);
			for (ScoreDoc item : tds.scoreDocs) {
				Document doc = indexSearcher.doc(item.doc);
				Calendar cal = Calendar.getInstance();
				cal.setTimeInMillis(Long.valueOf(doc.get("date")));
				System.out.println("名字:" + doc.get("name") + "邮箱:" + doc.get("email") + "id:" + doc.get("id") + "附件个数:"
						+ doc.get("attach") + "日期:" + cal.getTime().toString());
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (indexReader != null)
				try {
					indexReader.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
		}
	}

junit测试

lucene学习笔记三(查询)_第2张图片

你可能感兴趣的:(Lucene)