首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Lucene 4.3.0的StandardAnalyzer中使用CharFilter

在Lucene 4.3.0的StandardAnalyzer中使用CharFilter
EN

Stack Overflow用户
提问于 2013-06-13 01:07:49
回答 1查看 1.9K关注 0票数 4

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

似乎这里最简单的攻击计划是在分析之前过滤掉所有标点符号。根据Analyzer package documentation,这意味着我应该使用CharFilter

然而,在分析器中实际插入CharFilter似乎几乎是不可能的!

Analyzer.initReader的JavaDoc写着“如果你想插入一个CharFilter,就覆盖它”。

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

有一个AnalyzerWrapper类看起来非常适合我想要的!我可以提供一个基础分析器,并且只覆盖我想要的部分。除…外initReader已经被重写,委托给基本分析器,这个重写是“最终的”!真扫兴!

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

我是不是漏掉了什么?如何修改StandardAnalyzer以使用自定义CharFilter

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-13 01:42:14

其目的是让您覆盖Analyzer,而不是StandardAnalyzer。这个想法是,你永远不应该子类化一个分析器实现(关于here的一些讨论)。分析器的实现非常简单,向实现与StandardAnalyzer相同的记号赋予器/过滤器链的分析器添加CharFilter将类似于:

代码语言:javascript
复制
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
    }
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17071300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档