поиск в течение определенного промежутка времени - PullRequest
4 голосов
/ 30 мая 2011

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

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

Например, Я индексирую розетки и имею 3-4 диапазона, в течение которых розетка открыта. Мне нужно найти все торговые точки, которые открыты в определенный момент времени.

Один из способов сделать это - индексировать время начала и время окончания длительностей как отдельные поля даты и сравнивать во время поиска, как

(time1_1 > t AND time1_2 < t) OR (time2_1 > t AND time2_2 < t) OR (time3_1 > t AND time3_2 < t)

Есть ли лучший, быстрый, чистый способ сделать это?

1 Ответ

0 голосов
/ 14 февраля 2013

Ваш пример выглядит так, как будто сущности вашего индекса - это торговые точки, и вы храните время их открытия и закрытия в отдельных (возможно, динамических) полях.

Если вы запрашиваете другой подход, вы должны рассмотретьреструктурируйте существующую схему или даже создайте дополнительную схему, которая использует другую сущность.

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

Схема будет включать такие поля, как идентификатор, начальная дата дня или полдня или все, что вы выберете,конец этого, и многозначный список идентификаторов, которые указывают на выходы (сохраненные в вашем текущем индексе (используйте настройку многоядерности)).

Даже если вы выбираете четверть дня для обработки утренних, дневных и ночных часовотдельно и даже с предварительным просмотром в течение нескольких лет данные не должны взрываться.

Эта другая настройка схемы позволяет:

  • выполнять самые важные вычисления во время импорта, чтобы онилегко доступный при запросе,
  • простой запрос, который возвращает одним нажатием то, что вы ищете

Вы даже можете отказаться от полей Date, используя собственный способ определения диапазонов.Я думаю о создании идентификатора из даты и строки, которая указывает, является ли это утром или днем ​​и т. Д. Это будет использоваться в качестве уникального идентификатора в SOLR.Если вы можете создать такой идентификатор из любого «экземпляра времени», который запрашивается, вы получите простой поиск идентификатора.

Например, что открыто утром 2013/03/03?

/ solr / openhours / select? Q = id: 2013_03_03_am

возвращает: массив идентификаторов розеток.

...