2013-07-12 96 views

回答

0

這不是開箱即用的。看我下面的方式。

public final class LocaleAwareAnalyzer extends AnalyzerWrapper { 

private static final Logger LOG = LoggerFactory.getLogger(LocaleAwareAnalyzer.class); 

private final Analyzer defaultAnalyzer; 
private final Map<String, Analyzer> perLocaleAnalyzer = perLocaleAnalyzers(); 

public LocaleAwareAnalyzer(final Analyzer defaultAnalyzer) { 
    this.defaultAnalyzer = Precondition.notNull("defaultAnalyzer", defaultAnalyzer); 
} 

@Override 
protected Analyzer getWrappedAnalyzer(final String fieldName) { 
    if (fieldName == null) { 
     return defaultAnalyzer; 
    } 
    final int n = fieldName.indexOf('_'); 
    if (n >= 0) { 
     // Unfortunately CharArrayMap does not offer get(CharSequence, start, end) 
     final String locale = fieldName.substring(n + 1); 
     final Analyzer a = perLocaleAnalyzer.get(locale); 
     if (a != null) { 
      return a; 
     } 
     LOG.warn("No Analyzer for Locale '%s', using default", locale); 
    } 
    return defaultAnalyzer; 
} 

@Override 
protected TokenStreamComponents wrapComponents(final String fieldName, 
    final TokenStreamComponents components) { 

    return components; 
} 

private static Map<String, Analyzer> perLocaleAnalyzers() { 
    final Map<String, Analyzer> m = new HashMap<>(); 
    m.put("en", new EnglishAnalyzer(Version.LUCENE_43)); 
    m.put("es", new SpanishAnalyzer(Version.LUCENE_43)); 
    m.put("de", new GermanAnalyzer(Version.LUCENE_43)); 
    m.put("fr", new FrenchAnalyzer(Version.LUCENE_43)); 
    // ... etc 
    return m; 
} 

}