2011-06-09 11 views
5

私たちはLuceneを使用して、電子メールの受信トレイの場合のように、ユーザーに配信されるデータのフリーテキスト検索ボックスを開発しています。ボックスで日付を処理できるようにしたいと考えています(例:5/1/2011)。物事を簡単にするために、我々はちょうど2つの日付形式に機能の現在のバージョンを制限されています。私たちのプロトタイプについてはLuceneフリーテキスト検索クエリで日付を検出する方法は?

mm/dd/yy 
mm/dd/yyyy 

我々は、これら二つを探すためにクエリ文字列を事前処理しようとしたクエリ分析プロセスをハッキング日付パターン。これは約2年前、私たちはLucene 2.4でした。 Luceneには、DateFormatを受け入れ、識別された日付のTokenStreamを返すためのツールがあるかどうかは不思議です。 Luceneの2.9のjavadocを見て、私はクラスが見つかりました:

org.apache.lucene.analysis.sinks.DateRecognizerSinkFilter 

私が必要なものをやっているようだが、それはSinkFilter、Luceneのウィキに記載されていないような概念を実装しています。誰もこのフィルタを使いましたか?もしそうなら、それを使うのに最も効果的な方法は何ですか?

答えて

1

TeeSinkTokenFilterのドキュメントには、サンプルコードが少しあります(これは確かに複雑すぎます)。 DateRecognizerSinkFilterの設計方法は、実際の日付は格納されません。トークンが指定されたフォーマットに従った日付であることを検出するだけです。 DateRecognizerSinkFilterクラスを再実装して、DateFormatインスタンスの配列を取得し、DateAttribute(またはsome-such)という新しいAttributeクラスを作成し、日付認識ツールのサブクラスを使用して、解析された日付をDateAttributeに設定します。そのフォーマットは一致します。こうすることで、DateAttributeを調べて有効な日付があるかどうかを常にテストし、日付形式を1つのクラスにローカライズすることができます。もう1つの利点は、複数のシンクを処理する必要がなくなり、リンクされたサンプルからコードを単純化できることです。

+0

返信いただきありがとうございます!あなたの解決策を試して、結果を投稿します。 –

+0

素晴らしい!また、元の文字列と日付を同じ位置に出力する通常のインライントークナイザとして実装することもできます。このように、たとえば、日付の形式に月または日付の名前が含まれている場合でも、それらの文字を直接検索することができます。 –