lucene学习笔记三(查询)

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

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

181559_i1CD_1471190.png

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

创建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测试

162803_HWMC_1471190.png

转载于:https://my.oschina.net/kkrgwbj/blog/513362

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值