Category: Life & Work

lucene默认索引GBK格式文件没有问题,但是现在大多网站是UTF-8格式的。

假如在eclipse下调试的话,eclipse的控制台编码也是GBK格式的。

可以在运行的地方设置 eclipse的控制台编码方式。

lucene索引文件编码方式在如下地方更改:

IndexHtml.java=>HTMLDocument.java

    FileInputStream fis = new FileInputStream(f);
    //关键 更改被索引文件编码
    HTMLParser parser = new HTMLParser(fis,"utf-8");

 

 

问题产生:
用Lucene自带的htmlindex Demo在建索引时,会报错:
Parse Aborted: Lexical error at line 63, column 16.   Encountered: "\u987b" (39035), after : ""

究其原因是由于某html文档里的某标签内出现Unicode编码的字符,如出现中文,而导致的。

问题解决:
只要修改HtmlParser.jj,就可以解决以上问题:
第一:先下载一个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 的源文件

问题衍生:
如何让JavaCC HTML Parser支持过滤动态脚本内容% … %呢?
一个简单的方式是:可以把% … %中的内容当作一段html注释处理,这样需要修改htmlparser的注释token定义部分:
COMMENT_START (!– %)   LexComment
COMMENT_END (– ( )   – %)   DEFAULT

=================================================

由于自己的毕业设计要对html文件建索引,所以参考了 lucene2.4.0的demo,由于现在网上对这个demo的搭建都是较早版本,所以有很多的问题,现在把我的步骤阐述一下:
step1:首先需要准备好lucene-core-2.4.0.jar和IKAnalyzer2.0.2OBF.jar(不要使用IKAnalyzer1.4版本,它不怎么支持lucene-core-2.4.0.jar).
step2:在elipse里面建立一个java工程,把demo的原代码拷贝过来.
step3:把这个demo代码中的全部StandardAnalyzer修改为IK_CIKAnalyzer,此时你去调试demo会出现类似一下错误:

Parse Aborted: Lexical error at line 63, column 16.   Encountered: "\u987b" (39035), after : ""

step4:解决上面的问题需要:
      第一:先下载一个javacc
      第二:修改HtmlParser.jj文件的
       options { IGNORE_CASE = true; STATIC = false;} 为:
       options { IGNORE_CASE = true; STATIC = false;UNICODE_INPUT=true;}         
      第三:运行javacc HtmlParser.jj
      第四:把产生出来的7个java文件覆盖原先的java源文件
此时去建立索引试没有问题了,
但是如果要使用luceneweb来搜索还要修改jsp编码问题
step5:把luceneweb下面的5个jsp文件都加上

<%@ page contentType="text/html; charset=GBK" %>

step6:还需要修改results.jsp
把62行的

queryString = request.getParameter("query");

改为

 queryString =  new String( request.getParameter("query").getBytes("ISO8859-1"),"GBK");

并且把这个results.jsp里面的SdandardAnalyzer也要改为IK_CAnalyzer,并且不要忘记在results.jsp头部把IK_CAnalyzer导入
step7:如果还不行,需要修改一下你的tomcat(我的是6.0.10版本)的配置文件server.xml
:把46行附近的代码改为:

 <Connector port="8080" protocol="HTTP/1.1"
               maxThreads="150" connectionTimeout="20000"
               redirectPort="8443" URIEncoding="UTF-8" useBodyEncodingForURI="true" />

OK了