扩展TokenStream

时间:2012-11-13 20:28:07

标签: lucene.net token lucene

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

1 个答案:

答案 0 :(得分:2)

设置TermBuffer之后,您需要从IncrementToken返回true,当您无法再为TermBuffer提供任何内容时,您将返回false