Как выполнить поиск по дате рождения (не по дате рождения) в Solr?

StackOverflow https://stackoverflow.com/questions/702168

  •  22-08-2019
  •  | 
  •  

Вопрос

У меня есть индекс, в котором хранятся даты рождения, и я хотел бы найти любого, чья дата рождения находится в пределах X дней определенного месяца / дня.Например, я хотел бы знать, приближается ли у кого-нибудь день рождения через определенное количество дней, независимо от того, в каком году он родился.Как бы я выполнил этот запрос с помощью Solr?(в поле "дата рождения")

В качестве продолжения, предполагая, что этот запрос выполняется очень часто, должен ли я индексировать что-то другое, кроме даты рождения?Например, только пара месяц-день?Каков наиболее эффективный способ выполнить такой запрос (с точки зрения запроса и индексации)?

Это было полезно?

Решение

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

Запрос диапазона как есть не будет работать, потому что даты обычно внутренне индексируются как ГГГГММДД

Наличие отдельного поля в индексе, в котором просто хранятся строки MMDD, было бы легко доступно для поиска.Или, если вам не нужно дополнительное поле и вы готовы индексировать даты по-другому, измените порядок при индексации так, чтобы даты рождения индексировались MMDDYYY

Затем вы можете создать rangequeries , потому что все, с чем вам нужно сопоставить, находится в начале строки, а lucene соответствует лексиографически

(Диапазон, который был ba -> bc, соответствовал бы бите, бейсболу, но не потому, что.)

Подобная индексация - это единовременная фиксированная стоимость, и она не разрушает ничего, кроме внутренней организации в хронологическом порядке.Если это проблема, используйте два поля, дисковое пространство стоит дешево!)

Другие советы

Если пара день / месяц сложная (я не знаю, так это или нет), почему бы не указать поле "их день рождения в 1980 году" (были ли они тогда живы или нет).Тогда вам просто нужно выполнить поиск по 1980 году.Это эффективно пара день / месяц, но сохраненная в виде, который вы можете легко использовать.

Обратите внимание, что 1980 год - високосный, именно поэтому я выбрал его - иначе было бы трудно представить тех, у кого день рождения 29 февраля.

В качестве альтернативы, пара "день / месяц" в виде целого числа:

(100 * month) + day

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

Редактировать: У меня появилась еще одна идея.Это немного ароматно, но тем не менее...

Храните рождение Дата в формате, который фактически является месяцем, днем, годом.Я не знаю, мог бы Solr легко сделать это в формате ММ / дд / гггг, а затем выполнить поиск по лексикографическому порядку, но альтернативой является

(100000 * month) + (1000 * dayOfMonth) + (year - 1900)

(Это при условии, что вам не нужно хранить даты рождения раньше 1900 года.Я уверен, что вы сможете это адаптировать.)

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

Это действительно означает, что трудно сортировать людей по их фактическим возраст хотя.Я не знаю, является ли это проблемой для вас.

В любом случае, как я уже сказал, это немного нестандартно, но это может помочь :)

Вы могли бы сохранить день рождения в виде числа от 1 до 366.Затем выполните поиск по этому значению.Преимущество заключается в том, что после этого вы можете довольно легко выполнять поиск по дневным диапазонам.Недостатком является то, что вы не можете легко использовать это поле для поиска людей, у которых в этом месяце день рождения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top