Я бы выбрал один из двух вариантов:
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());
Обычно я выбираю первое, так как оно делает контроль над точностью более очевидным, но то, что вам больше нравится, должно работать нормально.
Также стоит упомянуть TrieDateField
, хотя я бы не рекомендовал вникать в это, если вы все равно еще не используете solr.
person
femtoRgon
schedule
22.09.2014