【问题标题】:Extending Lucene Analyzer扩展 Lucene 分析器
【发布时间】:2016-07-31 09:28:43
【问题描述】:

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

我特别想要字符串

“-苹果--胡萝卜-番茄?”

被标记为:

  1. “-apple-” 2. “-carrot-” 3. “tomato”

(用 -- 包围的字符串被视为单独的标记)

似乎要实现这一点,我必须自定义分析器和标记器。但是我必须从头开始重写它吗?例如,我不想告诉标记器(或标记过滤器)它应该省略“apple?”中的问号。

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

【问题讨论】:

    标签: java lucene


    【解决方案1】:

    基本上,您不能扩展 StandardAnalyzer,因为它是 final 类。但是你可以用你自己的分词器做同样的把戏,而且很简单。你也不能改变现有的,因为这是一个坏主意。

    我可以想象这样的事情:

    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 用破折号为你的逻辑添加所需的东西。希望它能帮助你。

    【讨论】:

    • 感谢您的详细解答。我不明白的一件事 - 你说我应该模仿 IncrementToken 中的 StandardAnalyzer 的逻辑。你的意思是我要从源代码中复制代码然后添加我的逻辑吗?因为那段代码非常复杂,我怀疑我是否能够充分理解它以知道在哪里以及如何添加我的逻辑,或者你只是想编写我自己的代码来实现相同的结果?
    • 两种方式都应该没问题,问题是这样实现,所以你会得到预期的行为
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    • 2013-02-20
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    • 2012-07-09
    相关资源
    最近更新 更多