ペイロードを持つ 1 つの用語を含むフィールドをドキュメントにインデックス付けしようとしています。私にとって機能する Field の唯一のコンストラクターは TokenStream を取るため、このクラスから継承し、必要なものの最も基本的な実装を提供することにしました。
public class MyTokenStream : TokenStream
{
TermAttribute termAtt;
PayloadAttribute payloadAtt;
bool moreTokens = true;
public MyTokenStream()
{
termAtt = (TermAttribute)GetAttribute(typeof(TermAttribute));
payloadAtt = (PayloadAttribute)GetAttribute(typeof(PayloadAttribute));
}
public override bool IncrementToken()
{
if (moreTokens)
{
termAtt.SetTermBuffer("my_val");
payloadAtt.SetPayload(new Payload(/*bye[] data*/));
moreTokens = false;
}
return false;
}
}
インデックス作成中に使用されたコード:
IndexWriter writer = //init tndex writer...
Document d = new Document();
d.Add(new Field("field_name", new MyTokenStream()));
writer.AddDocument(d);
writer.Commit();
そして、検索中に使用されたコード:
IndexSearcher searcher = //init index searcher
Query query = new TermQuery(new Term("field_name", "my_val"));
TopDocs result = searcher.Search(query, null, 10);
デバッガーを使用して、IncrementToken() の呼び出しが実際に TermBuffer を設定することを確認しました。私の問題は、返された TopDocs インスタンスがドキュメントを返さないことであり、その理由を理解できません...実際には TermPositions (ペイロードへのアプローチを提供します...) から始めましたが、結果も得られませんでした。誰かが私に何が間違っているのか説明できますか? 現在Lucene .NET 2.9.2を使用しています