Как сделать поиск в день рождения (а не в день рождения) в Solr? - PullRequest
3 голосов
/ 31 марта 2009

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

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

Ответы [ 3 ]

2 голосов
/ 31 марта 2009

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

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

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

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

(запрос диапазона, который был ba -> bc, соответствовал бы BAt, BAseball, но не BEcause.)

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

2 голосов
/ 31 марта 2009

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

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

Альтернативно, пара «день / месяц» в виде целого числа:

(100 * month) + day

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

РЕДАКТИРОВАТЬ: У меня была другая идея. Это немного мягко, но даже так ...

Сохраните дату рождения дату в формате, который является эффективно месяцем, днем, годом. Я не знаю, может ли Solr легко сделать это в формате MM / dd / yyyy, а затем выполнить поиск по лексикографическому порядку, но альтернатива -

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

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

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

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

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

0 голосов
/ 31 марта 2009

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

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