- SearchUtil.java
- import java.io.File;
- import java.io.IOException;
- import java.text.ParseException;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import org.apache.lucene.analysis.standard.StandardAnalyzer;
- import org.apache.lucene.document.Document;
- import org.apache.lucene.document.Field;
- import org.apache.lucene.document.NumericField;
- import org.apache.lucene.index.CorruptIndexException;
- import org.apache.lucene.index.IndexReader;
- import org.apache.lucene.index.IndexWriter;
- import org.apache.lucene.index.IndexWriterConfig;
- import org.apache.lucene.index.Term;
- import org.apache.lucene.search.IndexSearcher;
- import org.apache.lucene.search.NumericRangeQuery;
- 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.store.LockObtainFailedException;
- import org.apache.lucene.util.Version;
- public class SearchUtil {
- private String[] ids = {"1","2","3","4","5","6"};
- private String[] emails = {"[email protected]","[email protected]","[email protected]","[email protected]","[email protected]","[email protected]"};
- private String[] content ={
- "Welcome to Kenan my home",
- "Hello Kenan ",
- "Good morning",
- "Are you OK?",
- "Yeah hahahahahahaha Kenan",
- "I like foot ball"
- };
- private int[] attachs = {1,4,6,2,3,8};
- private Date[] dates = null;
- private String[] names = {"5555","333","44","111","222","666"};
- //词典
- private Directory directory = null;
- //写入笔
- private IndexWriter writer = null;
- //文档对象
- private Document doc = null;
- //读取对象
- private IndexReader reader = null;
- private IndexSearcher searcher = null;
- private void datesInit() {
- SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
- dates = new Date[6];
- try {
- dates[0] = sdf.parse("2010-12-01");
- dates[1] = sdf.parse("2011-12-01");
- dates[2] = sdf.parse("2001-12-01");
- dates[3] = sdf.parse("2013-12-01");
- dates[4] = sdf.parse("2003-12-01");
- dates[5] = sdf.parse("2014-12-01");
- } catch (ParseException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- public SearchUtil(){
- datesInit();
- try {
- directory = FSDirectory.open(new File("d:/lucene/index01"));
- buildIndex();
- this.getSearcher();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- /**
- * 构建索引
- */
- public void buildIndex(){
- try {
- writer = new IndexWriter(directory,new IndexWriterConfig(Version.LUCENE_35, new StandardAnalyzer(Version.LUCENE_35)));
- for(int i=0;i<6;i++){
- doc = new Document();
- doc.add(new Field ("id",ids[i],Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS));
- doc.add(new Field("email",emails[i],Field.Store.YES,Field.Index.NOT_ANALYZED));
- doc.add(new Field("content",this.content[i],Field.Store.NO,Field.Index.ANALYZED));
- doc.add(new Field("name",this.names[i],Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS));
- //给数字加索引
- doc.add(new NumericField("attach", Field.Store.YES,true).setIntValue(attachs[i]));
- //给日期加索引
- doc.add(new NumericField("date",Field.Store.YES,true).setLongValue(dates[i].getTime()));
- writer.addDocument(doc);
- }
- } catch (CorruptIndexException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (LockObtainFailedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }finally{
- if(writer != null){
- try {
- writer.close();
- } catch (CorruptIndexException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- }
- public IndexSearcher getSearcher(){
- try {
- if(reader == null){
- reader = IndexReader.open(directory);
- }else{
- IndexReader ir = IndexReader.openIfChanged(reader);
- if(ir!=null){
- reader.close();
- reader = ir;
- }
- }
- searcher = new IndexSearcher(reader);
- return searcher;
- } catch (CorruptIndexException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return null;
- }
- public void termQuery(String field,String name,int num){
- Query query = new TermQuery(new Term(field, name));
- try {
- TopDocs tds = this.searcher.search(query, num);
- System.out.println("查询到的结果数:"+tds.totalHits);
- for(ScoreDoc sd : tds.scoreDocs){
- doc = this.searcher.doc(sd.doc);
- System.out.println("id:"+doc.get("id")+"---"+"name:"+doc.get("name")+"---"+"attachs:"+doc.get("attach")+"---"+"email:"+doc.get("email"));
- }
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } finally {
- try {
- this.searcher.close();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- /**
- *
- * @param field 要查询的域
- * @param lowerTerm 开始的字符
- * @param upperTerm 结束的字符
- * @param num 查询的top个数
- * @param includeLower 是否包含开始的边界
- * @param includeUpper 是否包含结束的边界
- */
- public void termRangeQuery(String field,String lowerTerm,String upperTerm,int num,boolean includeLower, boolean includeUpper){
- Query query = new TermRangeQuery(field, lowerTerm, upperTerm, includeLower,includeUpper);
- try {
- TopDocs tds = this.searcher.search(query, num);
- System.out.println("查询到的结果数:"+tds.totalHits);
- for(ScoreDoc sd : tds.scoreDocs){
- doc = this.searcher.doc(sd.doc);
- System.out.println("id:"+doc.get("id")+"---"+"name:"+doc.get("name")+"---"+"attachs:"+doc.get("attach")+"---"+"email:"+doc.get("email"));
- }
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } finally {
- try {
- this.searcher.close();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- public void queryByNumericRange(String field,int min,int max,int num, boolean minInclusive, boolean maxInclusive){
- Query query = NumericRangeQuery.newIntRange(field, min, max, minInclusive, maxInclusive);
- try {
- TopDocs tds = this.searcher.search(query, num);
- System.out.println("查询到的结果数:"+tds.totalHits);
- for(ScoreDoc sd : tds.scoreDocs){
- doc = this.searcher.doc(sd.doc);
- System.out.println("id:"+doc.get("id")+"---"+"name:"+doc.get("name")+"---"+"attachs:"+doc.get("attach")+"---"+"email:"+doc.get("email"));
- }
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } finally {
- try {
- this.searcher.close();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- }
- TestSearchUtil.java
- import org.junit.BeforeClass;
- import org.junit.Test;
- public class TestSearchUtil {
- static SearchUtil su ;
- @BeforeClass
- public static void setUpBeforeClass() throws Exception {
- su = new SearchUtil();
- }
- @Test
- public void testTermQuery() {
- su.termQuery("content", "hello", 5);
- }
- @Test
- public void testTermRangeQuery(){
- su.termRangeQuery("name", "2", "4", 5, false, false);
- }
- @Test
- public void testQueryByNumericRange(){
- su.queryByNumericRange("id", 3, 4, 10, false, true);
- }
- }