Lucene中的自定义过滤器

时间:2014-06-23 12:37:26

标签: c# lucene

我在分析器中创建了一个自定义过滤器,用"/"字符分割术语。

我希望能够找到包含"testDocument Test/mystring/2014"字符串的文档,例如"test mystring""mystring 2014"

我实现了以下过滤器:

public class MyDelimiterFilter : TokenFilter
{

    private readonly ITermAttribute _termAtt;
    private readonly IPositionIncrementAttribute _positionAtt;
    private readonly Queue<char[]> _terms;

    public WordDelimiterFilter(TokenStream inStream)
        : base(inStream)
    {
        _termAtt = AddAttribute<ITermAttribute>();
        _positionAtt = AddAttribute<IPositionIncrementAttribute>();
        _terms = new Queue<char[]>();
    }

    public override bool IncrementToken()
    {
        if (_terms.Count != 0)
        {
            var buffer = _terms.Dequeue();

            _termAtt.SetTermBuffer(buffer,0,buffer.Length);
            _positionAtt.PositionIncrement = 1;
            return true;
        }

        if (!input.IncrementToken())
        {
            return false;
        }

        if (_termAtt.Term.Contains("/"))
        {
            var tempArray = _termAtt.Term.Split('/');
            foreach (var item in tempArray)
            {
                _terms.Enqueue(item.ToCharArray());
            }
        }
        else
        {
            _terms.Enqueue(_termAtt.Term.ToCharArray());
        }

        return true;
    }
}  

我可以调试这段代码,逻辑路径似乎是正确的。如果我尝试搜索,我会找到包含"testDocument""Test/mystring/2014"的文档,但结果为零,例如"mystring"

我想念的是什么?

1 个答案:

答案 0 :(得分:0)

这部分:

    if (_termAtt.Term.Contains("/"))
    {
        var tempArray = _termAtt.Term.Split('/');
        foreach (var item in tempArray)
        {
            _terms.Enqueue(item.ToCharArray());
        }
    }
    else
    {
        _terms.Enqueue(_termAtt.Term.ToCharArray());
    }

    return true;

不包含将_termAtt设置为正确值或增加位置的逻辑。您将从incrementToken返回true,这比您更多次。您能否在查询对象上提供toString方法的文本?

编辑:您回来的查询似乎是短语查询而不是简单的术语查询。 尝试在最终return true;语句

之前添加此代码段
    var buffer = _terms.Dequeue();

    _termAtt.SetTermBuffer(buffer,0,buffer.Length);
    _positionAtt.PositionIncrement = 1;

作为调试措施,您还可以在incrementToken方法中打印一些内容,并查看为各种输入调用的次数