[英]Custom analyzer in java, using edgeNGram token filter
這是我先前問題的延續。 我正在使用Lucene 3.6.1,並想要創建一個自定義分析器,該分析器會創建如下所示的令牌:-
輸入/輸出文本: 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
讓我知道我的代碼中缺少什么。
您需要使用StandardTokenizer
而不是KeywordTokenizer
。 后者將簡單地將整個輸入視為單個令牌,而前者將小寫並將輸入拆分為多個令牌。
所以改變這個:
TokenStream stream = new KeywordTokenizer(reader);
對此:
TokenStream stream = new StandardTokenizer(reader);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.