中文分词“庖丁解牛”BUG修正:高亮显示错位的问题
现象:检索后对关键字高亮显示时,高亮位置严重错误。使加粗在不相关的地方。
严重性:严重。
解析:
该现象的发生是由于建立索引的token位置构造错误引起的。经过诊断,错误的地方为XTokenizer.java的next方法。还好,代码只需要 做2、3行的增减。
解决:
在原来的XTokenizer类next方法找到:
@Override public Token next() throws IOException { // 已经穷尽tokensIteractor的Token对象,则继续请求reader流入数据 while (tokenIteractor == null || !tokenIteractor.hasNext()) { System.out.println(dissected); int read = 0; int remainning = -1;//重新从reader读入字符前,buffer中还剩下的字符数,负数表示当前暂不需要从reader中读入字符 if (dissected >= beef.length()) { remainning = 0; } else if (dissected < 0){ remainning = bufferLength + dissected; } if (remainning >= 0) { if (remainning > 0) { System.arraycopy(buffer, -dissected, buffer, 0, remainning); } read = input.read(buffer, remainning, bufferLength - remainning); int charCount = remainning + read; if (charCount < 0) { // reader已尽,按接口next()要求返回null. return null; } if (charCount < bufferLength) { buffer[charCount ++] = 0; } // 构造"牛",并使用knife"解"之 beef.set(0, charCount); offset += Math.abs(dissected); // 增加这个代码 //offset -= remainning; //删除或注释掉这行代码 dissected = 0; } dissected = knife.dissect((Collector)this, beef, dissected); //offset += read;// !!! //删除或注释掉这行代码 tokenIteractor = tokenCollector.iterator(); } // 返回tokensIteractor下一个Token对象 return tokenIteractor.next(); }