2013-03-25 2 views
0

Я использую Lucene с PHP для создания моей поисковой системы. Теперь каждый документ индекса имеет три поля: title, startTime и finishTime. С помощью веб-интерфейса PHP я могу узнать текущее время пользователя. В ответ на запрос пользователя я хочу, чтобы документы извлекались тогда и только тогда, когда текущее время пользователя находится между полями startTime и finishTime этого извлеченного документа.Запросы диапазона в Lucene

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

ответ

1

Во-первых, убедитесь, что startTime и finishTime являются целыми значениями, в идеале это числовое UNIX-время или количество тиков. Если вы используете представление даты строки, например «MM/dd/yyyy», это не сработает.

Ваш запрос можно перефразировать как «где startTime меньше, чем сейчас, и finishTime больше, чем сейчас». Это может быть преобразован в синтаксис запроса Lucene как так (где 555 текущее значение временной метки):

startTime:[0 TO 555] AND finishTime:[555 TO 999] 

(где 0 и 999 минимальные и максимальные связанные значения соответственно)

Обратите внимание, что если вы» повторное добавление других терминов, которые вы хотите сгруппировать эти предикаты диапазона с круглыми скобками, а также обратите внимание, что Lucene по умолчанию «OR» вместо «AND».

Ссылка синтаксис доступен здесь: http://lucene.apache.org/core/old_versioned_docs/versions/2_9_1/queryparsersyntax.html#Range%20Searches

В PHP вы могли бы сделать это следующим образом:

$userTime = getUserTime(); // this must be an integer numeric value. 
$max = mktime(23,59,59, 12,31,2099); // generates an upperbound timestamp 

$query = "startTime:[0 TO %1$d] AND finishTime:[%1$d TO %2$d]"; 
$query = sprintf($query, $userTime, $max); 

Затем представить $query Вашему запросу Lucene.

+0

Сэр, вы имеете в виду userTime также в том же формате, что и временная метка unix. Но сэр, в базе данных те тайминги, то есть startTime и finishTime, фиксированы и имеют формат hh: mm, скажем, startTime = 10: 00 am и finishTime = 12: 00 am. Поэтому во время запроса мне также нужно преобразовать эти времена в базу данных в временную метку unix. Но в lucene, как я это сделаю? И если я сохраняю эти startTime и заканчивая в базе данных как значение временной отметки unix, временная метка пользователей никогда не будет возникать между ними, поскольку временная метка пользователя - это недавняя метка времени. Сэр, если мое понимание ошибочно, пожалуйста, уточните меня. – Joy

+1

Моя ошибка, я подумал, что «время» относится к определенному моменту истории (т. Е. Значение «дата-время», а не значение «время суток»), но в любом случае подход все еще действителен. При создании ваших документов Lucene конвертируйте время с «hh: mm tt» в счетчик секунд '(HH * 60 * 60) + (мм * 60)', и стратегия поиска по-прежнему будет работать. – Dai

0

Преобразование в «короткий» формат ISO 8601 также будет работать («20130328T144734» или что-то подобное).

Смежные вопросы