2011-06-09 57 views
5

我们使用Lucene为交付给用户的数据开发一个免费的文本搜索框,就像电子邮件收件箱一样。我们希望允许该框处理日期,例如5/1/2011。为了方便起见,我们限制了功能的当前版本,只留下两个日期格式:如何在Lucene自由文本搜索查询中检测日期?

mm/dd/yy 
mm/dd/yyyy 

对于我们的原型,我们砍死查询分析过程来试图预先处理的查询字符串来寻找这两个日期模式。这是大约2年前,我们在Lucene 2.4上。我很好奇,看看Lucene中是否有任何工具可以接受DateFormat并返回带有任何标识日期的TokenStream。通过javadoc,了解Lucene的2.9看,我发现类:

org.apache.lucene.analysis.sinks.DateRecognizerSinkFilter 

这似乎做我所需要的,但它实现了SinkFilter,这似乎并没有在Lucene的维基记录在案的概念。有没有人使用过滤器之前,如果是这样,什么是最有效的方式来使用它?

回答

1

TeeSinkTokenFilter的文档中有一些示例代码(无可否认,这是过度复杂的)。请注意,DateRecognizerSinkFilter的设计方式是,它不存储实际日期;它只是检测到令牌是符合指定格式的日期。我会尝试的是重新实现DateRecognizerSinkFilter类以获取DateFormat实例的数组,创建一个名为DateAttribute(或某些此类)的新的Attribute类,并使用日期识别器子类将解析日期设置为DateAttribute,如果其格式匹配。这样,您可以始终通过询问DateAttribute来测试您是否拥有有效的日期,并将日期格式本地化为一个类。另一个优点是不必处理多个接收器,从而简化了链接示例中的代码。

+0

感谢您的回复!我会尝试解决您的解决方案并发布我的结果。 – 2011-06-16 20:27:40

+0

太棒了!您也可以将其作为一个常规的内嵌式标记器来实现,该标记器将原始字符串和日期放在同一位置。这样,例如,如果您的日期格式有月份或日期名称,那么您仍然可以直接搜索这些日期格式。 – 2011-06-16 21:15:04