今天在搜索结果高亮时候碰到了一个小问题,是“lucene高亮显示时,String index out of range异常”,百思不得其解,以前并没有出现过,后来google了下,终于觅得解决办法,哈哈。
搜了下javaeye,以前也有同学碰到和我一样的问题,在论坛上发问的,可是没有一个解答的,可能因为他没有贴代码的原因吧。
这个旧帖子是http://www.iteye.com/topic/89511
whk1007 写道
我用的是lucene-highlighter-2.0.0.jar,在高亮显示时,总是报错String index out of range: 16.发现好象是在方法highlighter.getBestFragment()处异常,请问是什么原因啊?
我今天出现的问题也和他一样,出现问题的代码是:
TokenStream tokenStream = TokenSources.getTokenStream((TermPositionVector) reader.getTermFreqVector(i, "CONTENT"));
问题就出现在上面这段代码中的i上,因为是for循环,所以我当时认为这个i就代表了docid,其实不然,在取得hits的情况下,我们通过hits.doc(i)来取得文档,通过hits.id(i)来取得文档号docid,所以上段代码中的变量i改为hits.id(i),如下
TokenStream tokenStream = TokenSources.getTokenStream((TermPositionVector) reader.getTermFreqVector(hits.id(i), "CONTENT"));
这样就不会出现java.lang.StringIndexOutOfBoundsException: String index out of range异常问题了
给我解决问题提示的文章是http://www.5yiso.cn/2008/02/12152.html 《Lucene 高亮 --不就行二次分词(zhuan)》
教训:这是不仔细看程序说明的后果啊,以后要遇到问题要仔细看lucene源代码和说明的!