Java 将CharFilter与Lucene 4.3.0';标准分析仪

Java 将CharFilter与Lucene 4.3.0';标准分析仪,java,lucene,Java,Lucene,我正在尝试将CharFilter添加到我的StandardAnalyzer。我的意图是从我索引的所有文本中去掉标点符号;例如,我希望前缀查询“pf”与“P.F.Chang's”匹配,或“zaras”与“Zara's”匹配 看来最简单的攻击方案是在分析之前过滤掉所有标点符号。根据,这意味着我应该使用CharFilter 然而,实际上几乎不可能将CharFilter插入分析器 的JavaDoc说“如果您想插入一个CharFilter,请覆盖它” 如果我的代码扩展了Analyzer,我可以扩展init

我正在尝试将
CharFilter
添加到我的
StandardAnalyzer
。我的意图是从我索引的所有文本中去掉标点符号;例如,我希望前缀查询“pf”与“P.F.Chang's”匹配,或“zaras”与“Zara's”匹配

看来最简单的攻击方案是在分析之前过滤掉所有标点符号。根据,这意味着我应该使用
CharFilter

然而,实际上几乎不可能将
CharFilter
插入分析器

的JavaDoc说“如果您想插入一个CharFilter,请覆盖它”

如果我的代码扩展了Analyzer,我可以扩展initReader,但我不能将抽象委托给我的基本StandardAnalyzer,因为它是受保护的。我不能委托给我的基本分析器,因为它是最终的。所以Analyzer的子类似乎不能使用另一个Analyzer来完成它的脏活

有一个
AnalyzerWrapper
类似乎非常适合我想要的!我可以提供一个基本分析器,只覆盖我想要的部分。除非…已被重写以委托给基本分析器,并且此重写是“最终的”!真倒霉

我想我可以将我的
分析器
放在
org.apache.lucene.analyzers
包中,然后我可以访问受保护的
createComponents
方法,但这似乎是一种令人厌恶的黑客方式,可以绕过我真正应该使用的公共API


我是不是错过了什么东西?如何修改
StandardAnalyzer
以使用自定义
CharFilter

目的是让您覆盖
Analyzer
,而不是
StandardAnalyzer
。我们的想法是,您永远不应该将Analyzer实现子类化(这里有一些讨论)。不过,Analyzer的实现非常简单,将CharFilter添加到实现与StandardAnalyzer相同的标记器/过滤器链的Analyzer中类似:

public final class MyAnalyzer {
    @Override
    protected TokenStreamComponents createComponents(String fieldName, Reader reader) {
        final StandardTokenizer src = new StandardTokenizer(matchVersion, reader);
        TokenStream tok = new StandardFilter(matchVersion, src);
        tok = new LowerCaseFilter(matchVersion, tok);
        tok = new StopFilter(matchVersion, tok, StopAnalyzer.ENGLISH_STOP_WORDS_SET);
        return new TokenStreamComponents(src, tok);
    }

    @Override
    protected Reader initReader(String fieldName, Reader reader) {
        //return your CharFilter-wrapped reader here
    }
}

嗯,考虑到我真正想要的是“带字符过滤器的StandardAnalyzer”,这似乎是一种非常严厉的做法。但看起来这是我唯一的选择。