如何将类似过滤器的过滤器添加到lucene搜索中。我想做lucene搜索以执行对同义词的搜索。我正在使用带有.net(mvc)平台的lucene。我试图找到解决方案,但没有得到正确的方法继续前进。
任何建议或帮助都会很明显。
提前致谢。
答案 0 :(得分:3)
您可以编写TokenFilter并将其与Analyzer一起使用。 在您的分析器中添加过滤器:
public override TokenStream TokenStream(string fieldName, System.IO.TextReader reader)
{
TokenStream result = BaseAnalyzer.TokenStream(fieldName, reader);
result = new SynonymFilter(result, _languages); // injects synonyms.
return result;
}
然后在SynonymFilter中输入原始单词相同位置的同义词:
private ITermAttribute _termAtt;
private ITypeAttribute _typeAtt;
private IPositionIncrementAttribute _posIncrAtt;
private Queue<string> _synonymTokenQueue = new Queue<string>();
private AttributeSource.State _current = null;
...
public SynonymFilter(TokenStream input)
: base(input)
{
_termAtt = AddAttribute<ITermAttribute>();
_typeAtt = AddAttribute<ITypeAttribute>();
_posIncrAtt = AddAttribute<IPositionIncrementAttribute>();
}
...
public override bool IncrementToken()
{
// if our synonymTokens queue contains any tokens, return the next one.
if (_synonymTokenQueue.Count > 0)
{
RestoreState(_current);
_termAtt.SetTermBuffer(_synonymTokenQueue.Dequeue());
_typeAtt.Type = "<SYNONYM>";
_posIncrAtt.PositionIncrement = 0;
return true;
}
try
{
if (!input.IncrementToken()) // EOS; iterator exhausted
{
return false;
}
}
catch (Exception ex)
{
return false;
}
if (!string.IsNullOrEmpty(_termAtt.Term))
{
List<string> synonyms = GetTermSynonyms(_termAtt.Term);
foreach (string synonym in synonyms)
{
_synonymTokenQueue.Enqueue(synonym);
}
}
_current = CaptureState();
return true;
}
这里的代码示例只是示例,而不是工作代码(!),我相信你可以从这里继续......:)
欧米