Solr- многозначное поле даты, диапазон запросов для соответствия «any» / «count»?

#lucene #solr

#lucene #solr

Вопрос:

Я использую Solr как часть механизма бронирования недвижимости — в моих записях есть многозначное поле даты, в котором хранятся даты, когда недвижимость уже забронирована и, следовательно, недоступна. Я хочу иметь возможность запрашивать это и возвращать записи, у которых нет дат в указанном окне.

Я на полпути — но прямо сейчас Solr, похоже, возвращает запись, если в ней есть хотя бы одна свободная дата — я хочу, чтобы она возвращала только те записи, которые полностью пусты в пределах диапазона. Пример моей сущности:

 <doc>
    <arr name="DateBlockDates">
        <date>2011-02-25T00:00:00Z</date>
        <date>2011-02-26T00:00:00Z</date>
        <date>2011-02-27T00:00:00Z</date>
    </arr>
</doc>
  

Запрос отлично работает в этом случае:

 -DateBlockDates:[2011-02-25T00:00:00Z TO 2011-02-27T00:00:00Z]
  

Потому что у объекта действительно есть блоки дат для каждого из этих дней. Однако, когда я запускаю:

 -DateBlockDates:[2011-02-25T00:00:00Z TO 2011-02-28T00:00:00Z]
  

Объект возвращается, потому что у него нет записи для 2011-02-28.

Чтобы перевести мой вопрос в SQL старой школы, я хочу выполнить «count (DateBlockDates) = 0». Есть идеи?

Ответ №1:

Это лучшее решение, которое я придумал — не использовать диапазон для запроса даты, а вместо этого использовать:

 -DateBlockDates:"2011-02-25T00:00:00.000Z"
AND -DateBlockDates:"2011-02-26T00:00:00.000Z"
AND -DateBlockDates:"2011-02-27T00:00:00.000Z"
AND -DateBlockDates:"2011-02-28T00:00:00.000Z"
  

Это грязно, но это работает. К счастью, я собираюсь иметь дело с относительно небольшими диапазонами дат, поэтому запрос не будет слишком длинным. Но если есть лучшее решение, я бы хотел его услышать.

Комментарии:

1. Привет, Аластер, ты когда-нибудь находил лучшее решение для этого? Я пытаюсь сохранить несколько значений datetime и иметь возможность выполнять поиск по ним в диапазоне дат.

2. рассмотрите возможность преобразования даты / времени в UTC (если еще нет), а затем в целочисленное значение, представляющее секунды с момента начала эпохи. Должно допускать более эмпирические запросы диапазона дат