我会选择以下两种可能性之一:
1 - 使用DateTools 获得一个有利于索引的字符串表示:
String indexableDateString = DateTools.dateToString(theDate, DateTools.Resolution.MINUTE);
doc.add(new StringField("importantDate", indexableDateString, Field.Store.YES));
...
TopDocs results = indexSearcher.search(new TermRangeQuery(
"importantDate",
new BytesRef(DateTools.dateToString(lowDate, DateTools.Resolution.MINUTE)),
new BytesRef(DateTools.dateToString(highDate, DateTools.Resolution.MINUTE)),
true,
false
));
...
Field dateField = resultDocument.getField("importantDate")
Date retrievedDate = DateTools.stringToDate(dateField.stringValue());
2 - 跳过日期工具,并使用 Date.getTime() 或 Calendar.getTimeInMillis() 或类似的东西将日期索引为数值:
long indexableDateValue = theDate.getTime();
doc.add(new LongField("importantDate", indexableDateValue, Field.Store.YES));
...
TopDocs results = indexSearcher.search(NumericRangeQuery.newLongRange(
"importantDate",
lowDate.getTime(),
highDate.getTime(),
true,
false
));
...
Field dateField = resultDocument.getField("importantDate")
Date retrievedDate = new Date(dateField.numericValue());
我通常会选择第一个,因为它使对精度的控制更加明显,但无论你喜欢哪个都应该可以正常工作。
另外值得一提的是 solr 的 TrieDateField,不过如果您还没有使用 solr,我真的不建议您参与其中。