Специальный анализатор Lucene - PullRequest
0 голосов
/ 26 января 2012

Я делаю поиск работы по сайту, используя Lucene, и справился с такой проблемой.Мне нужно искать C #, .net, поэтому мне нужно использовать WhiteSpaceAnalyzer, но если я использую его, поиск будет чувствительным к регистру.

Как я могу сделать этот случай нечувствительным?Сейчас я вижу только одно решение - сделать собственный анализатор.Но я новичок в Lucene, не могли бы вы помочь мне с примером кода для этого.Я сделал что-то, что я думаю, должно работать, но это не так.Посмотрите

public sealed class NewWhitespaceAnalyzer : Analyzer
    {
        public override TokenStream TokenStream(System.String fieldName, System.IO.TextReader reader)
        {
            return new LowerCaseFilter(new WhitespaceTokenizer(reader));
        }

        public override TokenStream ReusableTokenStream(System.String fieldName, System.IO.TextReader reader)
        {
            Tokenizer tokenizer = (Tokenizer)GetPreviousTokenStream();
            if (tokenizer == null)
            {
                tokenizer = new WhitespaceTokenizer(reader);
                SetPreviousTokenStream(tokenizer);
            }
            else
                tokenizer.Reset(reader);
            return tokenizer;
        }
    }

Если вы увидите здесь ошибку, пожалуйста, исправьте меня.

Если у вас есть какие-либо другие предложения, мы будем рады.

Спасибо за любую помощь, Дима.

Ответы [ 2 ]

3 голосов
/ 26 января 2012

Попробуйте это:

public sealed class NewWhitespaceAnalyzer : Analyzer
{
    public override TokenStream TokenStream(System.String fieldName, System.IO.TextReader reader)
    {
        return new LowerCaseFilter(new WhitespaceTokenizer(reader));
    }

    public override TokenStream ReusableTokenStream(System.String fieldName, System.IO.TextReader reader)
    {
        SavedStreams streams = (SavedStreams) GetPreviousTokenStream();
        if (streams == null)
        {
            streams = new SavedStreams();
            SetPreviousTokenStream(streams);
            streams.tokenStream = new WhiteSpaceTokenizer(reader);
            streams.filteredTokenStream = new LowerCaseFilter(streams.tokenStream);
        }
        else
        {
            streams.tokenStream.Reset(reader);
        }
        return streams.filteredTokenStream;
    }
}
0 голосов
/ 26 января 2012

Есть 2 пункта:

  • используйте LowerCaseFilter также в методе ReusableTokenStream.

  • не забудьте использоватьэтот пользовательский Analyzer как при разборе запроса, так и при индексации документа.

наслаждайтесь.

...