Lucene日期索引搜索

注意使用lucene的版本,调试本例的时候,作者使用的是lucene 2.4.1

package com.zhx.test;   
  
import java.io.IOException;   
import java.text.SimpleDateFormat;   
import java.util.Date;   
  
import org.apache.lucene.analysis.Analyzer;   
import org.apache.lucene.analysis.SimpleAnalyzer;   
import org.apache.lucene.document.DateTools;   
import org.apache.lucene.document.Document;   
import org.apache.lucene.document.Field;   
import org.apache.lucene.index.CorruptIndexException;   
import org.apache.lucene.index.IndexReader;   
import org.apache.lucene.index.IndexWriter;   
import org.apache.lucene.index.Term;   
import org.apache.lucene.search.IndexSearcher;   
import org.apache.lucene.search.RangeQuery;   
import org.apache.lucene.search.ScoreDoc;   
import org.apache.lucene.search.Searcher;   
import org.apache.lucene.search.TopDocs;   
import org.apache.lucene.store.LockObtainFailedException;   
  
public class IndexDate {   
  
    /**  
     * @param args  
     */  
    public static void main(String[] args) {   
        //索引所在的文件夹   
        String IDNEX_PATH = "Z:/data/paoding/test_index";     
        //索引字段名   
        String FILED_NAME = "fieldDate";   
        //索引字段名    
        String FILED_CONTENT = "field_content";   
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");     
        //获取Paoding中文分词器      
        Analyzer analyzer = new SimpleAnalyzer();      
        //建立索引      
        IndexWriter writer;      
        try {      
            //IndexWriter.MaxFieldLength(1)表示只索引到第几个项   
            writer = new IndexWriter(IDNEX_PATH, analyzer, true,new IndexWriter.MaxFieldLength(1));      
            //索引日期字段的值   
            Date fieldDate = sdf.parse("2009-08-22");   
            Document doc1 = new Document();    
            //用DateTools工具转换成String类型   
            String fieldDateStr = DateTools.dateToString(fieldDate,    
                    DateTools.Resolution.MINUTE);   
            //创建field,不存储,不分词但索引   
            Field field = new Field(FILED_NAME, fieldDateStr, Field.Store.NO,      
                Field.Index.NOT_ANALYZED, Field.TermVector.NO);      
            //创建field,存储,分词并索引   
            Field fieldContent = new Field(FILED_CONTENT, "记录1", Field.Store.YES,      
                    Field.Index.ANALYZED, Field.TermVector.YES);    
            //添加进doc   
            doc1.add(field);   
            doc1.add(fieldContent);   
            writer.addDocument(doc1);    
               
            Document doc2  = new Document();    
            fieldDate = sdf.parse("2009-08-20");   
            fieldDateStr = DateTools.dateToString(fieldDate,    
                    DateTools.Resolution.MINUTE);   
            field = new Field(FILED_NAME, fieldDateStr, Field.Store.NO,      
                Field.Index.NOT_ANALYZED, Field.TermVector.NO);    
            fieldContent = new Field(FILED_CONTENT, "记录2", Field.Store.YES,      
                    Field.Index.ANALYZED, Field.TermVector.YES);     
            doc2.add(field);      
            doc2.add(fieldContent);   
            writer.addDocument(doc2);      
            writer.close();      
            System.out.println("Indexed success!");      
                   
            //检索      
            IndexReader reader = IndexReader.open(IDNEX_PATH);    
            Date startDate = sdf.parse("2009-07-21");   
            Date endDate = sdf.parse("2009-09-21");   
            String startDateStr = DateTools.dateToString(startDate,    
                    DateTools.Resolution.MINUTE);   
            String endDateStr = DateTools.dateToString(endDate,    
                    DateTools.Resolution.MINUTE);   
            Term start = new Term(FILED_NAME,startDateStr);   
            Term end = new Term(FILED_NAME,endDateStr);   
            RangeQuery rangeQuery = new RangeQuery(start,end,true);     
            Searcher searcher = new IndexSearcher(reader);      
            //列表大小   
            int count = 10;   
            TopDocs topDocs = searcher.search(rangeQuery,count);      
            if (topDocs.totalHits == 0) {      
                System.out.println("hits.length=0");      
            }else{   
                //获取记录数组   
                ScoreDoc[] hits = topDocs.scoreDocs;   
                for(int i=0;i<hits.length;i++){   
                    //获取某条记录的Id   
                    int docId = hits[i].doc;   
                    Document doc = searcher.doc(docId);   
                    System.out.println("第"+i+"结果:"+doc.get(FILED_CONTENT));   
                }   
            }    
            reader.close();      
        } 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();      
  
        } catch (java.text.ParseException e) {   
            // TODO Auto-generated catch block   
            e.printStackTrace();   
        }   
     
     
  
    }   
  
}  

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值