2011-06-09 6 views
5

Stiamo utilizzando Lucene per sviluppare una casella di ricerca di testo libero per i dati consegnati a un utente, come nel caso di una casella di posta elettronica. Desideriamo consentire alla casella di gestire le date, ad esempio il 5/1/2011. Per rendere le cose più facili, stiamo limitando la versione corrente della funzione per soli due formati di data:Come rilevare una data in una query di ricerca libera del testo di Lucene?

mm/dd/yy 
mm/dd/yyyy 

Per il nostro prototipo abbiamo hacking il processo di analisi delle query per tentare di pre-processo la stringa di query per cercare questi due modelli di data. Questo era circa 2 anni fa, e noi eravamo su Lucene 2.4. Sono curioso di vedere se ci sono strumenti in Lucene pronti all'uso per accettare un DateFormat e restituire un TokenStream con date identificate. Guardando attraverso le javadocs per Lucene 2.9, ho trovato la classe:

org.apache.lucene.analysis.sinks.DateRecognizerSinkFilter 

che sembra fare quello che mi serve, ma implementa una SinkFilter, un concetto che non sembra essere documentato nel Lucene Wiki. Qualcuno ha mai usato questo filtro e, in caso affermativo, qual è il modo più efficace per usarlo?

risposta

1

C'è un po 'di codice di esempio (che è, certamente, troppo complicato) nella documentazione per TeeSinkTokenFilter. Si noti che il modo in cui è progettato DateRecognizerSinkFilter non memorizza la data effettiva; rileva semplicemente che un token è una data conforme al formato specificato. Quello che proverei è di ri-implementare la classe DateRecognizerSinkFilter per prendere una matrice di istanze DateFormat, creare una nuova classe Attribute chiamata DateAttribute (o some-such) e usare la sottoclasse di riconoscimento date per impostare la data analizzata in DateAttribute se una i suoi formati corrispondono. In questo modo, puoi sempre verificare se hai una data valida interrogando il DateAttribute e localizzare i formati della data in una classe. Un altro vantaggio è che non dovrai gestire più sink, semplificando in tal modo il codice dell'esempio collegato.

+0

Grazie per la risposta! Darò una soluzione alla tua soluzione e pubblicherò i miei risultati. –

+0

Ottimo! Si potrebbe anche implementarlo come un normale tokenizer in linea che emette la stringa originale e la data nella stessa posizione. In questo modo, se, ad esempio, il formato della tua data avesse nomi di mesi o date, potresti comunque cercare direttamente quelli. –

Problemi correlati