Пользовательский анализатор в Java, использующий фильтр токенов edgeNGram - PullRequest
0 голосов
/ 27 августа 2018

Это продолжение моего предыдущего вопроса .Я использую Lucene 3.6.1 и хочу создать собственный анализатор, который создает токены, как показано ниже: -

I / P текст: - foo bar

Токены: - f,fo,foo,b,ba,bar

I / P текст: - HEllo 123

Токены: - h,he,hel,hell,hello,1,12,123.

По сути, он преобразует текст в нижний регистр, а затем использует маркер n-граммы ребрафильтр.

Ниже приведен мой Java-код для пользовательского анализатора.

@Override
    public TokenStream tokenStream(String fieldName, Reader reader) {
        TokenStream stream = new KeywordTokenizer(reader);
        TokenStream result = new EdgeNGramTokenFilter(stream, EdgeNGramTokenFilter.Side.FRONT, 1, 30);
        //OffsetAttribute offsetAttribute = result.addAttribute(OffsetAttribute.class);
        CharTermAttribute charTermAttribute = result.addAttribute(CharTermAttribute.class);
        try {
            result.reset();
            while (result.incrementToken()) {
                //int startOffset = offsetAttribute.startOffset();
                //int endOffset = offsetAttribute.endOffset();
                System.out.println(charTermAttribute.toString());
            }
            result.end();
            result.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }

Но он возвращает ниже токенов для foo bar.

f
fo
foo
foo 
foo b
foo ba
foo bar

Дайте мне знать, чтоМне не хватает в моем коде.

1 Ответ

0 голосов
/ 27 августа 2018

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

Так что измените это:

    TokenStream stream = new KeywordTokenizer(reader);

на следующее:

    TokenStream stream = new StandardTokenizer(reader);
...