如何在Lucene.net搜索中添加同义词搜索

时间:2013-12-04 08:57:45

标签: asp.net-mvc-3 search lucene.net

如何将类似过滤器的过滤器添加到lucene搜索中。我想做lucene搜索以执行对同义词的搜索。我正在使用带有.net(mvc)平台的lucene。我试图找到解决方案,但没有得到正确的方法继续前进。

任何建议或帮助都会很明显。

提前致谢。

1 个答案:

答案 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;
    }

这里的代码示例只是示例,而不是工作代码(!),我相信你可以从这里继续......:)

欧米