Lucene 4.10 API запроса диапазона дат

Я хочу программно построить запрос диапазона для поля даты в Lucene 4.10, но я так и не нашел, как это сделать. Мой псевдокод будет:

new DateRangeQuery(dateLowerBound, dateUpperBound);

Стоит ли использовать класс org.apache.lucene.document.DateTool для его преобразования, а затем использовать NumericRangeQuery?


person pokeRex110    schedule 22.09.2014    source источник


Ответы (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());

Обычно я выбираю первое, так как оно делает контроль над точностью более очевидным, но то, что вам больше нравится, должно работать нормально.

Также стоит упомянуть TrieDateField, хотя я бы не рекомендовал вникать в это, если вы все равно еще не используете solr.

person femtoRgon    schedule 22.09.2014
comment
Я уже нашел решение для Solr, но я его не использую. TermRangeQuery, как я и подозревал, правильный. Некоторое время назад я помню, что Lucene ввела оптимизацию для дат. Я думаю, что первое решение, хотя я и не уверен, подходит для оптимизации. В худшем случае я могу обратиться в список рассылки Lucene. Спасибо - person pokeRex110; 23.09.2014