2013-12-17 29 views
4

我使用Lucene 4.6,並且是如何重用的TokenStream顯然不清楚,因爲我得到的異常:遇到問題重讀一個Lucene的TokenStream

java.lang.IllegalStateException: TokenStream contract violation: reset()/close() call missing, reset() called multiple times, or subclass does not call super.reset(). Please see Javadocs of TokenStream class for more information about the correct consuming workflow. 

在第二遍的開始。我讀過Javadoc,但我仍然錯過了一些東西。下面是拋出上述異常一個簡單的例子:

@Test 
public void list() throws Exception { 
    String text = "here are some words"; 
    TokenStream ts = new StandardTokenizer(Version.LUCENE_46, new StringReader(text)); 
    listTokens(ts); 
    listTokens(ts); 
} 

public static void listTokens(TokenStream ts) throws Exception { 
    CharTermAttribute termAtt = ts.addAttribute(CharTermAttribute.class); 
    try { 
    ts.reset(); 
    while (ts.incrementToken()) { 
     System.out.println("token text: " + termAtt.toString()); 
    } 
    ts.end(); 
    } 
    finally { 
    ts.close(); 
    } 
} 

我試過沒有要求TokenStream.end()TokenStream.close()想,也許他們應該只在最後被調用,但我得到了同樣的異常。

任何人都可以提供一個建議嗎?

回答

3

作爲一個可能的問題,Exception列出了多次調用reset(),你正在做什麼。在執行Tokenizer時明確不允許這樣做。由於java.io.Reader api不保證所有子類支持reset()操作,因此Tokenizer不能認爲傳入的Reader可以被重置。你可以簡單地構造一個新的TokenStream,或者我相信你可以調用Tokenizer.setReader(Reader)(在這種情況下,你肯定必須首先使用close())。

+0

謝謝,femtoRgon。重置閱讀器的工作。我錯誤地解釋了異常中的多重reset()限制,意味着不連續多次調用它,回想起來這將是一個奇怪的限制。 –

+0

請在代碼中填寫你所做的事情。答案劑量是有道理的。對於初學者,Tokernizer.setReader不是一個靜態方法。 –

+0

@ArunavSanyal,剛剛看到這個。已經差不多2年了,但我想我所做的上面的測試工作就是在兩次調用listTokens(ts)之間添加'ts.setReader(new StringReader(text))'。 –