我在分析器中创建了一个自定义过滤器,用"/"
字符分割术语。
我希望能够找到包含"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"
。
我想念的是什么?
答案 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
方法中打印一些内容,并查看为各种输入调用的次数