[英]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.