如何映射Java';s地区和Lucene';什么是分析仪?

如何映射Java';s地区和Lucene';什么是分析仪?,java,locale,lucene,Java,Locale,Lucene,我想找到与Java语言环境相对应的Lucene分析器。 例如,Locale.ENGLISH将映射到org.apache.lucene.analyzer.en.EnglishAnalyzer 某处有自动映射吗?这不是现成的。请看下面我的做法 public final class LocaleAwareAnalyzer extends AnalyzerWrapper { private static final Logger LOG = LoggerFactory.getLogger(Locale

我想找到与Java语言环境相对应的Lucene分析器。 例如,Locale.ENGLISH将映射到org.apache.lucene.analyzer.en.EnglishAnalyzer


某处有自动映射吗?

这不是现成的。请看下面我的做法

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;
}

}
public final类LocaleAwareAnalyzer扩展了AnalyzerWrapper{
私有静态最终记录器LOG=LoggerFactory.getLogger(LocaleAwareAnalyzer.class);
专用最终分析仪;
私有最终映射perLocaleAnalyzer=perLocaleAnalyzers();
公共LocaleAwareAnalyzer(最终分析器defaultAnalyzer){
this.defaultAnalyzer=premission.notNull(“defaultAnalyzer”,defaultAnalyzer);
}
@凌驾
受保护的分析器getWrappedAnalyzer(最终字符串字段名){
if(fieldName==null){
返回默认分析器;
}
final int n=fieldName.indexOf(“”“);
如果(n>=0){
//不幸的是,CharArrayMap不提供get(CharSequence、start、end)
最终字符串locale=fieldName.substring(n+1);
最终分析器a=perLocaleAnalyzer.get(locale);
如果(a!=null){
返回a;
}
LOG.warn(“没有用于区域设置“%s”的分析器,使用默认值”,区域设置);
}
返回默认分析器;
}
@凌驾
受保护的TokenStreamComponents wrapComponents(最终字符串字段名,
最终标记(组件){
返回组件;
}
私有静态映射perLocaleAnalyzers(){
final Map m=新的HashMap();
m、 put(“en”,新的英语语法分析器(版本:LUCENE_43));
m、 put(“es”,新的SpanishAnalyzer(版本:LUCENE_43));
m、 put(“de”,新德国分析仪(LUCENE_43版);
m、 put(“fr”,新的FrenchAnalyzer(版本:LUCENE_43));
//…等等
返回m;
}
}