我正在用Lucene索引科学文章。我正在使用以下配置:

EnglishAnalyzer analyzer = new EnglishAnalyzer(Version.LUCENE_43, EnglishAnalyzer.getDefaultStopSet());

IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_43, analyzer);


这对语言很有好处。但是我想删除诸如“ 0.99”或“ 3,14”之类的标记,但保留诸如“ H2O”之类的文本(如果可能的话,还保留“ n = 3”)。我已经尝试过SimpleAnalyzer,但不是我想要的。

有任何想法吗?

谢谢!

最佳答案

您可以使用自定义但简单的FilteringTokenFilter实现您想要的功能,该功能将过滤所有不需要的标记,例如通过regexp。您需要做的就是扩展此类并实现accept方法

protected boolean accept() throws IOException {
            String token = new String(termAtt.buffer(), 0 ,termAtt.length());
            if (token.matches("[0-9,.]+")) {
                return false;
            }
            return true;
        }


在这种情况下,我要过滤掉仅包含数字,逗号和点(可能是定界符)的所有令牌

        Tokenizer whitespaceTokenizer = new WhitespaceTokenizer(reader);
        TokenStream tokenStream = new StopFilter(whitespaceTokenizer, StopAnalyzer.ENGLISH_STOP_WORDS_SET);
        tokenStream = new ScientificFiltering(tokenStream);


为了不过滤n = 3和其他类似的构造,我建议使用WhitespaceTokenizer仅在空白字符上分割标记。

有关完整示例,请查看here

08-27 05:38