我已經得到完全相同的問題this thread,所以我打開一個新的問題。很抱歉,所有人都回答了鏈接的話題,BTW。Lucene TokenStream異常
所以:我試圖避免java.lang.IllegalStateException:TokenStream違反合同。
我有非常相似的鏈接上面的代碼:
protected TokenStreamComponents createComponents(String fieldName, Reader reader) {
String token;
CharArraySet stopWords = new CharArraySet(Version.LUCENE_48, 0, false);
stopWords.addAll(StopAnalyzer.ENGLISH_STOP_WORDS_SET);
keepWords.addAll(getKeepWordList());
Tokenizer source = new StandardTokenizer(Version.LUCENE_48, reader);
TokenStream filter = new StandardFilter(Version.LUCENE_48, source);
filter = new StopFilter(Version.LUCENE_48, filter, stopWords);
ShingleFilter shiFilter = new ShingleFilter(filter, 2, 3);
CharTermAttribute cta = shiFilter.addAttribute(CharTermAttribute.class);
try {
shiFilter.reset();
while(shiFilter.incrementToken()) {
token = cta.toString();
System.out.println(token);
}
shiFilter.end();
shiFilter.close();
}
catch (IOException ioe) {
ioe.printStackTrace();
}
return new TokenStreamComponents(source, filter);
}
我不明白,提出的解決方案:這是什麼意思「只是構建一個新的TokenStream」或「重置讀者」?我都試過的解決方案,比如增加:
source.setReader(reader);
或更改:
filter = new StopFilter(Version.LUCENE_48, filter, stopWords);
ShingleFilter shiFilter = new ShingleFilter(filter, 2, 3);
但誤差最後。任何建議?
因此,如果我理解正確,將這段代碼放入createComponents中會涉及「重置」的不正確使用,即重置已關閉的資源。這說得通。 然後,我必須移動我的自定義分析器所在的那個部分。無論如何,我的目的不是調試。我想創建自定義標記,例如選擇某些詞的鄰域。我認爲我應該把它做成createComponents。 – PatrickBateman1981
如果你想做一些處理來修改(或添加或刪除)分析中的標記,你應該實現一個['TokenFilter'](http://lucene.apache.org/core/4_8_0/core/org/apache/lucene的/分析/ TokenFilter。html),並將它添加到你的過濾器鏈中(就像你的'ShingleFilter'或'StopFilter'一樣)。 – femtoRgon
那麼我應該做的唯一事情就是重寫'TokenFilter'抽象類中的'incrementToken'方法嗎? – PatrickBateman1981