2015-08-10 4 views
1

Я использую Lucene 5.1.0, я хочу, чтобы мой индексный писатель только индексировал термины, начинающиеся с заглавной буквы. Я посмотрел на пользовательские анализаторы и токензатор шаблонов, но я не мог понять, как их использовать, чтобы индексировать только слова, которые начинаются (или все буквы) с большой буквы. Любая помощь будет оцененаКак использовать шаблонный токенизатор для индексирования только слов, начинающихся с заглавной буквы в lucene

ответ

4

Я нашел эту ссылку полезной для упаковки мою голову вокруг пользовательских tokenizers/Анализаторы/фильтры: http://www.citrine.io/blog/2015/2/14/building-a-custom-analyzer-in-lucene

Однако в вашем случае я думаю, что это легче расширить org.apache.lucene.analysis.util.FilteringTokenFilter вместо TokenFilter:

public class StartsWithCapitalTokenFilter extends FilteringTokenFilter { 

    private final CharTermAttribute termAtt = addAttribute(CharTermAttribute.class); 

    public StartsWithCapitalTokenFilter(TokenStream tokenStream) { 
     super(tokenStream); 
    } 

    @Override 
    public boolean accept() { 
     // When accept() is called, my understanding is that termAtt.buffer() will 
     // contain the particular string (in char[] form) of whichever token 
     // is under consideration. This call gets the Unicode code point of the 
     // first character and checks if it's uppercase. 
     return Character.isUpperCase(Character.codePointAt(termAtt.buffer(),0)); 

     // Or if you don't want to care about Unicode about U+FFFF, use the below. 
     //return Character.isUpperCase(termAtt.buffer()[0]); 
    } 
} 

Для этого вам понадобится какой-то пользовательский анализатор, чтобы использовать фильтр. Это один использует только новый фильтр:

public class StartswithCapitalAnalyzer extends Analyzer { 
    @Override 
    protected TokenStreamComponents createComponents(String field, Reader reader) { 
     Tokenizer tokenizer = new StandardTokenizer(); 
     TokenStream filter = new StartsWithCapitalTokenFilter(tokenizer); 

     // chain any other filters you want in here, like so: 
     //filter = new LowerCaseFilter(filter); 

     return new TokenStreamComponents(tokenizer, filter); 
    } 
} 

Это все должно быть функциональным, хотя у меня нет условий, чтобы проверить это прямо сейчас. Удачи!

+0

Это прекрасно! Большое спасибо! только то, что я искал –

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