无法重读Lucene TokenStream

时间:2013-12-17 01:30:49

标签: lucene

我正在使用Lucene 4.6,显然不清楚如何重用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(),也许只会在最后调用它们,但我会得到同样的例外。

有人可以提出建议吗?

1 个答案:

答案 0 :(得分:3)

Exception列表,作为一个可能的问题,多次调用reset(),您正在执行此操作。在Tokenizer的实现中明确不允许这样做。由于java.io.Reader api不保证所有子类都支持reset()操作,因此Tokenizer不能假设传入的Reader可以重置,毕竟

你可以简单地构建一个新的TokenStream,或者我相信你可以调用Tokenizer.setReader(Reader)(在这种情况下你肯定必须先close()。)