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

时间:2018-08-27 06:48:45

标签: java elasticsearch lucene tokenize

这是我之前的question的延续。我正在使用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

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

1 个答案:

答案 0 :(得分:1)

您需要使用StandardTokenizer而不是KeywordTokenizer。后者将简单地将整个输入视为单个令牌,而前者将将小写并将输入拆分为多个令牌。

所以改变这个:

    TokenStream stream = new KeywordTokenizer(reader);

对此:

    TokenStream stream = new StandardTokenizer(reader);