3

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

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

4

3 回答 3

2

如果天/月对很棘手(我不知道是否如此),为什么不设置“他们 1980 年的生日”字段(无论他们当时是否还活着)。然后您只需要针对 1980 进行搜索。这实际上是一个日/月对,但存储在一个您可以轻松使用的类型中。

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

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

(100 * month) + day

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

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

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

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

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

您仍然可以恢复原始出生日期,但排序将按生日顺序排列,任何特定日期的年龄最大的人都会排在第一位。

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

无论如何,正如我所说,这有点离谱,但它可能会有所帮助:)

于 2009-03-31T17:40:11.447 回答
2

您需要记住 Solr 使用 Lucene,并且到目前为止 - 一切都作为字符串存储和索引。

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

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

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

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

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

于 2009-03-31T18:45:07.267 回答
0

您可以将生日存储为从 1 到 366 的数字。然后搜索该值。优点是您可以很容易地搜索日期范围。缺点是你不能轻易地使用这个字段来查找生日是这个月的人。

于 2009-03-31T18:01:17.323 回答