我正在尝试将具有一个具有有效负载的术语的字段索引到文档中。由于唯一可以为我工作的 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 开始的(这给了我处理 Payload 的方法......),但它也没有给我任何结果。有人可以向我解释我做错了什么吗?我目前正在使用 Lucene .NET 2.9.2