Lucene 4.10 Диапазон дат Запрос Api
Я хочу построить диапазонный запрос для поля даты программно в Lucene 4.10, но я не нашел никакого способа сделать это. Мой псевдокод будет:
new DateRangeQuery(dateLowerBound, dateUpperBound);
Является ли хорошей идеей использовать класс org.apache.lucene.document.DateTool, чтобы преобразовать его, а затем использовать NumericRangeQuery?
1 ответ
Я бы выбрал одну из двух возможностей:
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.