繁体   English   中英

Lucene中的自定义过滤器

[英]Custom filter in 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"

我想念什么?

这部分 :

    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设置为适当值或递增位置的逻辑。 从增量令牌返回true的次数将比这种方式返回的次数更多。 您能否在您的查询对象上提供toString方法的文本?

编辑:似乎您返回的查询是短语查询而不是简单术语查询。 尝试在最终return true;之前添加此代码段return true; 声明

    var buffer = _terms.Dequeue();

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

作为调试措施,您还可以在incrementToken方法内打印某些内容,并查看各种输入被调用多少次。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM