【问题标题】:Lucene how can i turn off "toLowerCase" in StandardAnalyzer?Lucene 如何在 StandardAnalyzer 中关闭“toLowerCase”?
【发布时间】:2021-07-03 11:27:59
【问题描述】:

我想标记我的文本,我使用 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”?

【问题讨论】:

  • 大小写不一样不想匹配?

标签: java lucene


【解决方案1】:

您不能直接在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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-16
    • 2014-01-13
    • 2013-11-24
    相关资源
    最近更新 更多