Lucene.NET TokenStream.Next方法消失了

时间:2014-04-07 08:17:39

标签: c# .net lucene lucene.net

我必须使用Lucene.NET更新项目。我第一次见到这个库,我应该更新对新版本的引用。所以我通过NuGet使用Lucene引用。

但实际上我应该更新一些在新版本中消失的方法。

public abstract class AnalyzerView
{
    public abstract string Name { get; }

    public virtual string GetView(TokenStream tokenStream,out int numberOfTokens)
    {
        StringBuilder sb = new StringBuilder();

        Token token = tokenStream.Next();

        numberOfTokens = 0;

        while (token != null)
        {
            numberOfTokens++;
            sb.Append(GetTokenView(token));
            token = tokenStream.Next();
        }

        return sb.ToString();
    }

    protected abstract string GetTokenView(Token token);
}

文档对我来说不是很清楚。据我所知,我应该使用像

这样的东西
while (tokenStream.IncrementToken()) { ... }

但如何获得以下令牌对我来说是一个谜。

我在StackOverflow上看到了similar question,但我的问题是我需要获得Token而不是string,因为我有一些使用令牌的代码,如下所示:

public class TermWithOffsetsView : AnalyzerView {
    public override string Name {
        get { return "Terms With Offsets"; }
    }

    protected override string GetTokenView(Token token) {
        return token.TermText() + 
            "   Start: " + token.StartOffset().ToString().PadLeft(5) + 
            "  End: " + token.EndOffset().ToString().PadLeft(5) + 
            "\r\n";
    }
}

1 个答案:

答案 0 :(得分:4)

最后,经过一些研究,实现了类似的东西:

public abstract class AnalyzerView
{
    public abstract string Name { get; }

    public virtual string GetView(TokenStream tokenStream,out int numberOfTokens)
    {
        StringBuilder sb = new StringBuilder();
        numberOfTokens = 0;
        while (tokenStream.IncrementToken())
        {
            numberOfTokens++;
            sb.Append(GetTokenView(tokenStream));
        }

        return sb.ToString();
    }

    protected abstract string GetTokenView(TokenStream tokenStream);
}

使用这样的派生类:

public class TermWithOffsetsView : AnalyzerView {
    public override string Name {
        get { return "Terms With Offsets"; }
    }

    protected override string GetTokenView(TokenStream tokenStream) {
        ITermAttribute termAtt = tokenStream.AddAttribute<ITermAttribute>();
        IOffsetAttribute offsetAtt=tokenStream.AddAttribute<IOffsetAttribute>();

        return string.Format("{0}   Start: {1}  End: {2}{3}",
            termAtt.Term,
            offsetAtt.StartOffset.ToString().PadLeft(5),
            offsetAtt.EndOffset.ToString().PadLeft(5),
            Environment.NewLine);
    }
}