2011-06-09 8 views
5

Używamy Lucene do opracowania pola wyszukiwania dla danych dostarczanych użytkownikowi, tak jak w przypadku skrzynki pocztowej. Chcielibyśmy pozwolić, aby ramka obsługiwała daty, na przykład 5/1/2011. Żeby było łatwiej, jesteśmy ograniczając aktualną wersję funkcji do zaledwie dwóch formatów daty:Jak wykryć datę w kwerendzie wyszukiwania wolnego tekstu Lucene?

mm/dd/yy 
mm/dd/yyyy 

Dla naszego prototypu my posiekany proces analizy zapytań do próby wstępne przetworzenie ciąg kwerendy szukać tych dwóch wzory dat. Było to około 2 lata temu i byliśmy na Lucene 2.4. Jestem ciekaw, czy są jakieś narzędzia w Lucene, gotowe do zaakceptowania DateFormat i zwrócenia TokenStream z dowolnymi ustalonymi datami. Przeglądając Javadocs dla Lucene 2.9, znalazłem klasę:

org.apache.lucene.analysis.sinks.DateRecognizerSinkFilter 

który wydaje się robić to, co muszę, ale implementuje SinkFilter, koncepcji, które nie wydają się być udokumentowane w Lucene Wiki. Czy ktokolwiek użył tego filtra przed, a jeśli tak, jaki jest najskuteczniejszy sposób jego użycia?

Odpowiedz

1

Istnieje trochę kodu przykładowego (co jest, wprawdzie zbyt skomplikowane) w dokumentacji dla TeeSinkTokenFilter. Zauważ, że sposób zaprojektowania DateRecognizerSinkFilter nie zapisuje faktycznej daty; po prostu wykrywa, że ​​token jest datą, która jest zgodna z określonym formatem. Spróbowałbym ponownie wdrożyć klasę DateRecognizerSinkFilter, aby pobrać tablicę instancji DateFormat, utworzyć nową klasę Atrybut o nazwie DateAttribute (lub inne) i użyć podklasy odczytującej datę, aby ustawić przetwarzaną datę na DateAttribute, jeśli któraś z jego formaty pasują. W ten sposób zawsze możesz sprawdzić, czy masz poprawną datę, przesłuchując atrybut DateAttribute i zlokalizować formaty daty w jednej klasie. Kolejną zaletą jest to, że nie trzeba obsługiwać wielu zlewów, co upraszcza kod z połączonego przykładu.

+0

Dzięki za odpowiedź! Przedstawię twoje rozwiązanie i opublikuję wyniki. –

+0

Świetnie! Możesz również zaimplementować to jako zwykły tokenizer in-line, który emituje oryginalny ciąg i datę w tej samej pozycji. W ten sposób, jeśli na przykład Twój format daty zawiera nazwy miesięcy lub dat, możesz nadal wyszukiwać je bezpośrednio. –

Powiązane problemy