#datetime #search #solr #range
#datetime #Поиск #solr #диапазон
Вопрос:
Я знаю, что 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:
Ваш пример выглядит так, как будто объектами вашего индекса являются торговые точки, и вы сохраняете время их открытия и закрытия в отдельных (возможно, динамических) полях.
Если вы запрашиваете другой подход, вам следует рассмотреть возможность реструктуризации существующей схемы или даже создать дополнительную, использующую другой объект.
На первый взгляд это может показаться необычным, но если этот запрос является наиболее важным для вашего приложения, тогда вам следует рассмотреть возможность привязки объекта вашего нового индекса к тому, что вы действительно хотите запросить: конкретному экземпляру time. Я так понимаю, экземпляр time — это либо целый день, либо, возможно, половина или четверть дня.
Схема будет включать такие поля, как идентификатор, дата начала дня или половины дня или что бы вы ни выбрали, его окончание и многозначный список идентификаторов, которые указывают на торговые точки (хранятся в вашем текущем индексе (используйте многоядерную настройку)).
Даже если вы выберете квартальные дни для обработки утренних, дневных и ночных часов отдельно, и даже с предварительным просмотром за несколько лет, данные не должны быть разнесены.
Эта другая настройка схемы позволяет:
- выполните наиболее важные вычисления во время импорта, чтобы они были легко доступны при запросе,
- простой запрос, который возвращает за одно нажатие то, что вы ищете
Вы могли бы даже отказаться от полей даты, используя пользовательский способ определения диапазонов. Я подумываю о создании идентификатора из даты и строки, которая указывает, утро это или полдень и т.д. Это будет использоваться в качестве уникального идентификатора в SOLR. Если вы можете создать такой идентификатор из любого «экземпляра времени», который запрашивается, вы получите простой поиск идентификатора.
например, что открыто в 2013/03/03 утром?
/solr/openhours/select?q=id:2013_03_03_am
возвращает: Массив идентификаторов розеток.