Lucene 如何在 StandardAnalyzer 中关闭 "toLowerCase"?

Lucene how can i turn off "toLowerCase" in StandardAnalyzer?

我想标记我的文本,我使用 StandardAnalyzer 的 tokenStream,但它默认为“toLowerCase”。

我的代码:


        ArrayList<String> toTextWord = new ArrayList<>(); 
        Analyzer analyzer = new StandardAnalyzer();

        try (TokenStream stream = analyzer.tokenStream("tags", new StringReader(iterStr))) {

            stream.addAttribute(CharTermAttribute.class);
            stream.reset();
            while (stream.incrementToken()) {
                CharTermAttribute token = stream.getAttribute(CharTermAttribute.class);
                System.out.println(token.toString());
                toTextWord.add(token.toString());
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

如何在没有“toLowerCase”的情况下使用 StandardAnalyzer?我如何关闭此 StandardAnalyzer 中的“toLowerCase”?

您不能直接在 StandardAnalyzer 中关闭 toLowerCase

您可以创建一个与 StandardAnalyzer 行为相同的自定义分析器,然后对其进行自定义以满足您的需要:

使用 org.apache.lucene.analysis.custom.CustomAnalyzer 的示例:

Analyzer analyzer = CustomAnalyzer.builder()
        .withTokenizer("standard")
        .addTokenFilter("lowercase")
        .addTokenFilter("stop")
        .build();

现在您可以注释掉(或删除)小写标记过滤器:

Analyzer analyzer = CustomAnalyzer.builder()
        .withTokenizer("standard")
        .addTokenFilter("stop")
        .build();

请注意,如果您想与默认的标准分析器完全匹配,那么您还应该注释掉或删除停用词过滤器,因为默认情况下不会从标准分析器中删除停用词,除非您提供明确的列表。

这给了我们这个:

Analyzer analyzer = CustomAnalyzer.builder()
        .withTokenizer("standard")
        .build();

如果我在自定义分析器中使用以下输入:

String iterStr = "Eric the quick brown fox jumps over Freddy the lazy dog, LOL.";

那么你的代码输出如下:

Eric
the
quick
brown
fox
jumps
over
Freddy
the
lazy
dog
LOL

更新

使用 CustomAnalyzer 时,您可以使用字符串值来识别不同的分词器和过滤器对象 - 例如上面示例中使用的“标准”和“小写”。

如果你想避免使用这些标识符,你可以使用带有NAME字段的相关工厂对象:

Analyzer analyzer = CustomAnalyzer.builder()
        .withTokenizer(StandardTokenizerFactory.NAME)
        .addTokenFilter(LowerCaseFilterFactory.NAME)
        .addTokenFilter(StopFilterFactory.NAME)
        .build();