java中的自定义分析器,使用edgeNGram令牌过滤器

这是我上一个问题的延续。我正在使用 Lucene 3.6.1 并想创建一个自定义分析器来创建如下标记:-


I/P 文本 :- foo bar


代币:- f,fo,foo,b,ba,bar


I/P 文本 :- HEllo 123


代币:- h,he,hel,hell,hello,1,12,123。


基本上,它将文本转换为小写,然后使用边缘 n-gram 标记过滤器。


下面是我的自定义分析器的 java 代码。


@Override

    public TokenStream tokenStream(String fieldName, Reader reader) {

        TokenStream stream = new KeywordTokenizer(reader);

        TokenStream result = new EdgeNGramTokenFilter(stream, EdgeNGramTokenFilter.Side.FRONT, 1, 30);

        //OffsetAttribute offsetAttribute = result.addAttribute(OffsetAttribute.class);

        CharTermAttribute charTermAttribute = result.addAttribute(CharTermAttribute.class);

        try {

            result.reset();

            while (result.incrementToken()) {

                //int startOffset = offsetAttribute.startOffset();

                //int endOffset = offsetAttribute.endOffset();

                System.out.println(charTermAttribute.toString());

            }

            result.end();

            result.close();

        } catch (IOException e) {

            e.printStackTrace();

        }

        return result;

    }

但它返回低于foo bar.


f

fo

foo

foo 

foo b

foo ba

foo bar

让我知道我的代码中缺少什么。


白板的微信
浏览 118回答 1
1回答

蓝山帝景

您需要使用StandardTokenizer而不是KeywordTokenizer。后者将简单地将整个输入视为单个标记,而前者将小写并将输入拆分为多个标记。所以改变这个:    TokenStream stream = new KeywordTokenizer(reader);对此:    TokenStream stream = new StandardTokenizer(reader);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java