扩展Lucene Analyzer

时间:2016-07-31 09:28:43

标签: java lucene

我在 Lucene 中有特殊的分析需求,但我想继续使用 StandardAnalyzer 机制的部分内容。

特别是,我想要字符串

“ - 苹果 - 胡萝卜 - 西红柿?”

要标记为:

  1. “ -​​ apple-”2。“ - carrot-”3。“番茄”
  2. (用 - 包围的字符串被视为单独的标记)

    为了达到这个目的,我必须自定义分析器和标记器。但我是否必须从头开始重写它?例如,我不想告诉tokenizer(或令牌过滤器)它应该省略“apple?”中的问号。

    有没有办法只修改现有的分析仪?

1 个答案:

答案 0 :(得分:3)

基本上,您无法扩展StandardAnalyzer,因为它是最终类。但你可以用自己的标记器做同样的技巧,而且很简单。你也无法改变现有的,因为这是一个坏主意。

我可以想象这样的事情:

public class CustomAnalyzer extends Analyzer {

    protected TokenStreamComponents createComponents(String s) {
        // provide your own tokenizer, that will split input string as you want it
        final Tokenizer standardTokenizer = new MyStandardTokenizer();

        TokenStream tok = new StandardFilter(standardTokenizer);
        // make everything lowercase, remove if not needed
        tok = new LowerCaseFilter(tok);
        //provide stopwords if you want them
        tok = new StopFilter(tok, stopwords);
        return new TokenStreamComponents(standardTokenizer, tok);
    }

    private class MyStandardTokenizer extends Tokenizer {

        public boolean incrementToken() throws IOException {
            //mimic the logic of standard analyzer and add your rules
            return false;
        }
    }
}

我将所有内容都放在一个课程中,只是为了便于在此发布。一般来说,你需要在 MyStandardTokenizer 中使用自己的逻辑(例如,你可以从 StandardAnalyzer 复制代码(它是最终的,所以不再延伸),然后在 incrementToken < / strong>用破折号为你的逻辑添加所需的东西。希望它能帮到你。