Как я могу использовать ASCIIFoldingFilter в моем приложении Lucene? - PullRequest
3 голосов
/ 28 июля 2010

У меня есть стандартное приложение Lucene, которое выполняет поиск по индексу. Мой индекс содержит много французских терминов, и я хотел бы использовать ASCIIFoldingFilter.

Я много занимался поиском и понятия не имею, как его использовать. Конструктор принимает объект TokenStream. Вызывать ли метод на анализаторе, который получает TokenStream при отправке ему поля? Тогда что мне делать? Может кто-нибудь указать мне на пример, где используется TokenFilter? Спасибо.

Ответы [ 2 ]

10 голосов
/ 30 сентября 2010

Фильтры токенов, такие как ASCIIFoldingFilter, в своей основе являются TokenStream, поэтому анализатор возвращает их, главным образом, с помощью следующего метода:

public abstract TokenStream tokenStream(String fieldName, Reader reader);

Как вы заметили, фильтрыпринять TokenStream в качестве входных данных.Они действуют как обертки или, точнее говоря, как декораторы на их вход.Это означает, что они улучшают поведение содержимого TokenStream, выполняя как свою операцию, так и операцию содержимого ввода.

Вы можете найти объяснение здесь .Он не имеет прямого отношения к ASCIIFoldingFilter, но применяется тот же принцип.По сути, вы создаете пользовательский анализатор с чем-то вроде этого (упрощенный пример):

public class CustomAnalyzer extends Analyzer {
  // other content omitted
  // ...
  public TokenStream tokenStream(String fieldName, Reader reader) {
    TokenStream result = new StandardTokenizer(reader);
    result = new StandardFilter(result);
    result = new LowerCaseFilter(result);
    // etc etc ...
    result = new StopFilter(result, yourSetOfStopWords);
    result = new ASCIIFoldingFilter(result);
    return result;
  }
  // ...
}

И TokenFilter, и Tokenizer являются подклассами TokenStream .

Помните также, что вы должны использовать один и тот же пользовательский анализатор как при индексировании, так и при поиске, иначе вы можете получить неверные результаты в своих запросах.

4 голосов
/ 05 августа 2014

Структура абстрактного класса Analyzer, похоже, изменилась за эти годы.Метод tokenStream установлен в final в текущей версии (v4.9.0).Следующий класс должен сделать работу:

// Accent insensitive analyzer
public class AccentInsensitiveAnalyzer extends StopwordAnalyzerBase {
    public AccentInsensitiveAnalyzer(Version matchVersion){
        super(matchVersion, StandardAnalyzer.STOP_WORDS_SET);
    }

    @Override
    protected TokenStreamComponents createComponents(String fieldName, Reader reader) {
        final Tokenizer source = new StandardTokenizer(matchVersion, reader);

        TokenStream tokenStream = source;
        tokenStream = new StandardFilter(matchVersion, tokenStream);
        tokenStream = new LowerCaseFilter(tokenStream);
        tokenStream = new StopFilter(matchVersion, tokenStream, getStopwordSet());
        tokenStream = new ASCIIFoldingFilter(tokenStream);
        return new TokenStreamComponents(source, tokenStream);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...