0

我正在尝试将具有一个具有有效负载的术语的字段索引到文档中。由于唯一可以为我工作的 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

4

1 回答 1

2

设置 TermBuffer 后,您需要从返回 true IncrementToken,当您没有任何东西可以提供 TermBuffer 时,您会返回 false

于 2012-11-13T20:41:10.987 回答