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.

Другие вопросы по тегам