java 中的自定义分析器,使用 edgeNGram 标记过滤器
Custom analyzer in java, using edgeNGram token filter
这是我之前 的延续。我正在使用 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;
}
但它 returns 低于 foo bar
的标记。
f
fo
foo
foo
foo b
foo ba
foo bar
让我知道我的代码中缺少什么。
您需要使用 StandardTokenizer
而不是 KeywordTokenizer
。后者会将整个输入简单地视为单个标记,而前者会将输入小写并拆分为多个标记。
所以改变这个:
TokenStream stream = new KeywordTokenizer(reader);
对此:
TokenStream stream = new StandardTokenizer(reader);
这是我之前
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;
}
但它 returns 低于 foo bar
的标记。
f
fo
foo
foo
foo b
foo ba
foo bar
让我知道我的代码中缺少什么。
您需要使用 StandardTokenizer
而不是 KeywordTokenizer
。后者会将整个输入简单地视为单个标记,而前者会将输入小写并拆分为多个标记。
所以改变这个:
TokenStream stream = new KeywordTokenizer(reader);
对此:
TokenStream stream = new StandardTokenizer(reader);