Lucene Demo中的编码问题

Published: 26 Apr 2011 Category:

使用Lucene自带的示例程序lucene-demos-3.0.3.jar时,发现其中的索引程序IndexHTML.java索引一些网页时会报错:

Parse Aborted: Lexical error at line 63, column 16.

Encountered: "\u987b" (39035), after : ""

出错的地方都是HTML标签中Unicode编码的中文字符处。

经过一些搜索和试验,解决办法如下:

1. (见http://www.wenhq.com/article/view_448.html

第一:先下载一个javacc

第二:修改HtmlParser.jj文件的

options { IGNORE_CASE = true; STATIC = false;} 为:
options { IGNORE_CASE = true; STATIC = false; UNICODE_INPUT=true;}

第三:运行javacc HtmlParser.jj

第四:把产生出来的java文件覆盖JavaCC HTML Parser 的源文件

除了修改HtmlParse.jj外,还做了如下两处修改:

2.(见http://blog.eood.cn/lucene%E5%A6%82%E4%BD%95%E7%B4%A2%E5%BC%95utf-8%E6%A0%BC%E5%BC%8F%E6%96%87%E4%BB%B6

在IndexHtml.java文件中,

HTMLParser parser = new HTMLParser(fis);
改为:
HTMLParser parser = new HTMLParser(fis,"utf-8");

3.修改HTMLParser.java。

public Reader getReader() throws IOException {}中,
pipeIn = new InputStreamReader(pipeInStream, "UTF-16BE");
pipeOut = new OutputStreamWriter(pipeOutStream, "UTF-16BE");
将上面两行原来的编码都换为UTF-8。

完成上面的修改后,把java文件都编译为class文件,重新打包。

注意打包时,应该切换到/demo路径下,即此时在文件夹窗口可以看到的应该是org文件夹。

打包命令是:

jar cvf lucene-demos-3.0.3.jar org

完成上述修改后就可以使用新的jar包进行文件索引操作。