2011-03-01 15 views
4

Luceneを使い始めたばかりですが、私は基本的な誤解が必要なように感じていますが、サンプルやドキュメントからこの問題を理解できませんでした。LuceneでTokenStreamフィールドを検索する

stringで初期化されたフィールドは正常に動作しますが、LuceneはTokenStreamで初期化されたフィールドの結果を返すようには見えません。私はLucene.NET 2.9.2 RC2を使用しています。

[編集]これも最新のJavaバージョン(3.0.3)で試してみましたが、同じ動作をするので、ポートのいくつかの奇妙なものではありません。ここで

は、基本的な例である:

Directory index = new RAMDirectory(); 
Document doc = new Document(); 
doc.Add(new Field("fieldName", new StandardTokenizer(new StringReader("Field Value Goes Here")))); 
IndexWriter iw = new IndexWriter(index, new StandardAnalyzer()); 
iw.AddDocument(doc); 
iw.Commit(); 
iw.Close(); 
Query q = new QueryParser("fieldName", new StandardAnalyzer()).Parse("value"); 
IndexSearcher searcher = new IndexSearcher(index, true); 
Console.WriteLine(searcher.Search(q).Length()); 

(私はこれは2.9で廃止予定のAPIを使用して実現するが、それはただ簡潔にするためだ...そこにあると私はのいずれかを使用したバージョンを指定する引数をふり新しいSearch秒)。

これは結果を返しません。

私は

doc.Add(new Field("fieldName", "Field Value Goes Here", Field.Store.NO, Field.Index.ANALYZED)); 

でフィールドを追加ラインを交換する場合、私が期待するようしかし、その後、クエリは、ヒットを返します。 TextReaderバージョンを使用している場合でも動作します。

両方のフィールドは、同じトークナイザ/アナライザ(私は他人も試しました)と一緒に索引付けされ、トークン化されていますが、どちらも格納されていないので、私の直感は同じように動作する必要があります。私は何が欠けていますか?

答えて

1

私は答えがケーシングであることを発見しました。

StandardAnalyzerによって作成されるトークンストリームはを作成すると、このようなフィルタは直接適用されませんが、LowerCaseFilterがあります。

+0

StandardAnalyzerは、StopFilterを介して一般的な英語のStopWordsもフィルタリングします。 Luceneの経験則は、両側にTokenStreamsの全く同じ設定で検索してインデックスを付けることです。あなたのコードでは、StandardTokenizerを直接インスタンス化するべきではありませんが、StandardAnalyzer.TokenStream()を使用して作成してください –

関連する問題