我有一个存储出生日期的指标,我想搜索的人,其出生日期是在一定月/日的X天。例如,我想知道如果任何人的生日快到了一定的天数内,无论他们出生何年。我将如何执行此查询此使用Solr的? (关于 “出生日期” 字段中)

将作为后续,假设该查询经常执行,我应该比索引诞生至今以外的东西?如只包括月,日对?什么是最有效的方式做到这样的查询(从查询和索引的角度来看)?

有帮助吗?

解决方案

您需要记住,Solr的使用Lucene的,而且截至目前 - 一切都存储并索引为字符串

范围查询作为是不会工作,因为日期通常内部索引为YYYYMMDD

具有在只存储MMDD字符串将是易于搜索的索引中的单独字段。或者,如果你不想一个额外的字段,并愿意指数的日期不同,建立索引时,重新排列顺序,使生日被索引MMDDYYY

然后就可以构建rangequeries,因为你需要的一切来匹配在字符串的前面,和Lucene lexiographically匹配

(这是BA甲rangequery - > BC将匹配BAT,棒球,但不是因为)

这样

索引是一次性固定成本,并且犯规破坏比按时间顺序内部布置的任何其他。如果这是一个问题,使用两个字段,磁盘空间很便宜!)

其他提示

如果每天/每月对是棘手的(我不知道它是否是与否),为什么没有“在1980年他们的生日”的领域(无论他们是否还活着,然后与否)。然后,你只需要做搜索对1980年这是的有效的日/月对,而是存储在一个类型,你可以很容易地使用。

请注意,1980年是闰年,这就是为什么我选择了它 - 否则那些与2月29日的生日可能很难代表

可替换地,“日/月”对以整数的形式:

(100 * month) + day

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

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

在一个格式有效的月,日,年存储诞生的日期的。我不知道的Solr可以很容易地做到这一点在MM / dd / yyyy格式,然后做一个字典顺序搜索,但另一种方法是

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

(这是假设你不需要它来存储出生日期早于1900年。我敢肯定,你可以定制它。)

您仍然可以恢复原来的出生日期,但订货会在生日顺序,从最早的第一人针对任何特定的日期。

它意味着它很难通过自己的实际的年龄的人分开,虽然。我不知道如果这是你的问题。

无论如何,我说这是一个有点现成的墙,但它可能会帮助:)

您可以在生日存储为数字从1到366,然后搜索该值。其优点是,你可以再与天范围内搜索很容易。缺点是,你不能轻易使用这一领域找到人,他们的生日就在这个月。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top