如何在Lucene自由文本搜索查询中检测日期?

时间:2011-06-09 14:14:52

标签: lucene

我们正在使用Lucene为发送给用户的数据开发一个自由文本搜索框,就像电子邮件收件箱一样。我们想允许盒子处理日期,例如2011年5月1日。为了简化操作,我们将该功能的当前版本限制为两种日期格式:

mm/dd/yy
mm/dd/yyyy

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

org.apache.lucene.analysis.sinks.DateRecognizerSinkFilter

似乎做了我需要的东西,但它实现了一个SinkFilter,这个概念似乎没有在Lucene Wiki中记录。有没有人之前使用过这个过滤器,如果有的话,最有效的方法是什么?

1 个答案:

答案 0 :(得分:1)

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