2011-06-09 6 views
5

Estamos utilizando Lucene para desarrollar un cuadro de búsqueda de texto libre para los datos entregados a un usuario, como en el caso de una bandeja de entrada de correo electrónico. Nos gustaría permitir que el cuadro maneje las fechas, por ejemplo 5/1/2011. Para facilitar las cosas, estamos limitando la versión actual de la función de sólo dos formatos de fecha:¿Cómo detectar una fecha en una consulta de búsqueda de texto libre de Lucene?

mm/dd/yy 
mm/dd/yyyy 

Para nuestro prototipo que hackeó el proceso de análisis de consulta para tratar de pre-proceso de la cadena de consulta para buscar estos dos patrones de fecha. Esto fue hace aproximadamente 2 años, y estábamos en Lucene 2.4. Tengo curiosidad por ver si hay alguna herramienta en la aplicación de fábrica de Lucene para aceptar un formato de fecha y devolver un flujo de datos TokenStream con cualquier fecha identificada. Mirando a través de los javadocs para Lucene 2.9, me encontré con la clase:

org.apache.lucene.analysis.sinks.DateRecognizerSinkFilter 

que parece hacer lo que necesito, pero implementa un SinkFilter, un concepto que no parece ser documentados en el Wiki Lucene. ¿Alguien ha usado este filtro anteriormente y, de ser así, cuál es la forma más efectiva de usarlo?

Respuesta

1

Hay un poco de código de muestra (que, es cierto, es demasiado complicado) en la documentación para TeeSinkTokenFilter. Tenga en cuenta que la forma en que se diseña DateRecognizerSinkFilter no almacena la fecha real; solo detecta que un token es una fecha que se ajusta al formato especificado. Lo que intentaría es volver a implementar la clase DateRecognizerSinkFilter para tomar una matriz de instancias de DateFormat, crear una nueva clase de atributo llamada DateAttribute (o algo así) y usar la subclase date recognizer para establecer la fecha analizada en DateAttribute si una de sus formatos coinciden. De esta forma, siempre puede probar si tiene una fecha válida al interrogar a DateAttribute y localizar los formatos de fecha en una clase. Otra ventaja es que no tendrá que manejar múltiples receptores, simplificando así el código del ejemplo vinculado.

+0

Gracias por la respuesta! Voy a probar tu solución y publicar mis resultados. –

+0

¡Genial! También puede implementar esto como un tokenizador en línea regular que emite la cadena original y la fecha en la misma posición. De esa manera, si, por ejemplo, su formato de fecha tuviera nombres de mes o fecha, podría buscarlos directamente. –

Cuestiones relacionadas