2015-06-01 4 views
1

Мне нужен токенизатор Lucene, который может выполнять следующие действия. Учитывая струна "вина пробки для бутылок", следующие запросы должны преуспетьTokenizer Lucene Analyzer для поиска подстроки

  • вино
  • гельминтоз
  • крышка
  • Ottl
  • ApS
  • вино bottl

Вот что я до сих пор. Как я могу изменить его для работы? Никакой запрос менее трех символов не должен работать.

public class PorterAnalyzer extends Analyzer { 

    private final Version version; 

    public PorterAnalyzer(Version version) { 
    this.version = version; 
    } 

    @Override 
    @SuppressWarnings("resource") 
    protected TokenStreamComponents createComponents(String fieldName, Reader reader) { 
    final StandardTokenizer src = new StandardTokenizer(reader); 
    TokenStream tok = new StandardFilter(src); 
    tok = new LowerCaseFilter(tok); 
    tok = new StopFilter(tok, StandardAnalyzer.STOP_WORDS_SET); 
    tok = new PorterStemFilter(tok); 
    return new TokenStreamComponents(src, tok); 
    } 

} 

ответ

1

Я думаю, что вы ищете NGramTokenFilter.

Try, например:

tok=new NGramTokenFilter(tok,2,5); 
+0

могли бы вы объяснить немного, что делает minGram и maxGram? В основном, как я знаю, что эти значения должны быть для разных запросов? –

+0

Я очень новичок в Lucene, и я понятия не имею, что такое N-грамм. Спасибо –

+0

Когда вы ищете «ottl», вы не получаете никаких результатов, потому что в вашем индексе содержится только «бутылка». Но вы можете добавить NGramTokenFilter в цепочку фильтров индексирования. Это добавило бы все возможные части, по крайней мере, minGram (т. Е. 2) и максимальные буквы maxGram (т. Е. 5). Например, с двумя буквами: bo, ot, tt ... и 3 буквы bot, ott, ottl, ... и 4 ... и 5 букв: bottl и ottle – timo

 Смежные вопросы

  • Нет связанных вопросов^_^