如何在Solr进行生日(不是出生日期)搜索?

时间:2009-03-31 17:34:02

标签: solr

我有一个存储出生日期的索引,我想搜索出生日期在某个月/日的X天内的任何人。例如,我想知道是否有人在一定天数内过生日,无论他们出生在哪一年。我如何使用Solr执行此查询? (在“生日”字段上)

作为后续行动,假设此查询经常执行,我应该索引除出生日期以外的其他内容吗?比如只是一个月的一对?从查询和索引的角度来看,执行此类查询的最有效方法是什么?

3 个答案:

答案 0 :(得分:2)

如果日/月对很棘手(我不知道是不是),为什么不选择“他们1980年的生日”(无论他们是否还活着)。然后你只需要对1980进行搜索。这是有效日/月对,但存储在一个你可以轻松使用的类型中。

请注意,1980年是闰年,这就是我选择它的原因 - 否则那些2月29日生日的人很难代表。

或者,以整数形式的“日/月”对:

(100 * month) + day

会给你一个简单的表示,很容易搜索和索引。我经常发现在单个字段中存储数据比使用两个字段更简单。然后,我再也没用过Solr ......

编辑:我有另一个想法。这有点温和,但即便如此......

以有效月,日,年的格式存储出生日期。我不知道Solr是否可以轻松地以MM / dd / yyyy格式进行,然后进行字典顺序搜索,但替代方案是

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

(假设您不需要它来存储1900年以前的出生日期。我相信您可以定制它。)

您仍然可以恢复原始出生日期,但订单将按生日顺序排列,最老的人可以在任何特定日期使用。

这确实意味着很难按实际的年龄对人进行排序。我不知道这对你来说是不是一个问题。

无论如何,正如我所说,它有点不合时宜,但它可能会有所帮助:)。

答案 1 :(得分:2)

你需要记住Solr使用Lucene,而且截至目前 - 所有内容都被存储并索引为字符串。

范围查询不起作用,因为日期通常在内部索引为YYYYMMDD

在索引中只有一个存储MMDD字符串的单独字段很容易搜索。或者,如果您不想要额外的字段,并且愿意以不同方式对日期编制索引,请在编制索引时重新排列顺序,以便将出生日期编入索引MMDDYYY

然后你可以构造范围查询,因为你需要匹配的所有东西都在字符串的前面,而lucene匹配的是lexiographically

(ba - > bc的范围查询将匹配BAt,BAseball,但不是因为。)

像这样的索引是一次性固定成本,并且不会按时间顺序销毁除内部排列之外的任何内容。如果这是一个问题,请使用两个字段,磁盘空间便宜!)

答案 2 :(得分:0)

您可以将生日存储为1到366之间的数字。然后搜索该值。优点是您可以非常轻松地搜索日期范围。缺点是您无法轻松使用此字段查找本月生日的人。