注意使用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();
}
}
}