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
バージョンを使用している場合でも動作します。
両方のフィールドは、同じトークナイザ/アナライザ(私は他人も試しました)と一緒に索引付けされ、トークン化されていますが、どちらも格納されていないので、私の直感は同じように動作する必要があります。私は何が欠けていますか?
StandardAnalyzerは、StopFilterを介して一般的な英語のStopWordsもフィルタリングします。 Luceneの経験則は、両側にTokenStreamsの全く同じ設定で検索してインデックスを付けることです。あなたのコードでは、StandardTokenizerを直接インスタンス化するべきではありませんが、StandardAnalyzer.TokenStream()を使用して作成してください –