首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

13) 第二章 目录:用Lucene索引日期和时间

2012-10-25 
13) 第二章 索引:用Lucene索引日期和时间?? ? 对Lucene而言,每个域都是String类型。然而在真实的应用中,我

13) 第二章 索引:用Lucene索引日期和时间

?

? ? 对Lucene而言,每个域都是String类型。然而在真实的应用中,我们还会遇到诸如日期、整数、浮点数等其它类型。如何是好?Lucene自然有其处理之道。

? ? 先让我们来看看Lucene是怎么处理日期类型的吧!

? ? 日期类型的使用场景可谓多之又多:邮件的寄出、收到日期;文件的创建日期、最后修改日期;HTTP响应中的最后修改日期等等。总之,绝大多数情况下,你会有处理日期的遭遇!Don't worry! Lucene为我们装备了一个处理日期的利器:DateTools. 通过它,我们可以便捷的把Date型转换成String型:? ? ? ??

Document doc = new Document();doc.add(new Field("indexDate",                DateTools.dateToString(new Date(),  DateTools.Resolution.DAY),                Field.Store.YES,                Field.Index.NOT_ANALYZED));

? ? DateTools 可以把日期和时间转换成 YYYYMMDDhhmmss 的格式,并根据指定的resolution去除相应后缀。比如你指定了Resolution.DAY,2012年12月21日就会被转换成20121221,时分秒部分会被去除掉。这么一来,就很容易发现,即便是按字符串进行排序、比较,也能得到和日期相同的效果。字符串"20121221"是大于"20121121"的,而其对应的日期也是如此。采用这种方式处理日期是不是很简单?参数resolution允许你截取对你的应用有意义的日期部分,精确度从Resolution.MILLISECOND(毫秒)到Resolution.YEAR(年),但是值得注意的是,更高的精度就需要付出更大的代价!

? ? 提醒你一下,如果你的应用中需要搜索一个YYYYMMDD范围内的数据,而在展示的时候又希望把时间部分(hhhmmss)也带上,你可以尝试创建两个域,一个索引到Resolution.DAY范围,另一个仅仅设置Store.

?

? ? 最后,我给出一个完整的例子:

import java.io.IOException;import java.util.Calendar;import java.util.Date;import junit.framework.TestCase;import org.apache.lucene.analysis.WhitespaceAnalyzer;import org.apache.lucene.document.DateTools;import org.apache.lucene.document.Document;import org.apache.lucene.document.Field;import org.apache.lucene.index.IndexWriter;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.TopDocs;import org.apache.lucene.store.Directory;import org.apache.lucene.store.RAMDirectory;public class IndexDateTest extends TestCase{private Directory directory;protected void setUp() throws Exception {Calendar cal = Calendar.getInstance();cal.set(2011, 5, 10);Date date = new Date(cal.getTimeInMillis());directory = new RAMDirectory();IndexWriter writer = getWriter(); Document doc = new Document();        doc.add(new Field("indexDate",                DateTools.dateToString(date, DateTools.Resolution.DAY),                Field.Store.YES,                Field.Index.NOT_ANALYZED));        writer.addDocument(doc);        writer.close();}public void testDateIndex() throws IOException {IndexSearcher is = new IndexSearcher(directory);Query query = new TermQuery(new Term("indexDate", "20110610")); TopDocs topDocs = is.search(query, 1);        ScoreDoc[] docs = topDocs.scoreDocs;        Document doc = is.doc(docs[0].doc);        assertEquals("20110610", doc.get("indexDate"));}private IndexWriter getWriter() throws IOException {return new IndexWriter(directory, new WhitespaceAnalyzer(),IndexWriter.MaxFieldLength.UNLIMITED);}}
?

?

1 楼 xkorey 2011-06-10   女程序员,你好! 2 楼 JavaYog 2011-06-21   xkorey 写道女程序员,你好!
非也 3 楼 leiwuluan 2011-12-14   JavaYog 写道xkorey 写道女程序员,你好!
非也
哈哈哈、、、

热点排行