经过研究,把lucene的中文搜索的用法公布一下。
另外,在这里顺便问一下:
1.有没有人用过cocoon,它的中文问题很令人烦恼,猜想主要是编码部分许多地方默认的有问题。
2.http://www.sourceforge.net大家能不能连上?我这里很久连不上了,很多东西下不了。
3.有谁能把以前的kjava包发给我(j2me_cldc-1_0_2-fcs-kjava_overlay.zip)。虽然比较过时了,但是我找不到。
如有错误,欢迎指正!
lucene使用中文检索的方法,这里以在Win2k,jbuilder6,Resin2.1下为例
1.下载lucene1.2和lucene Analyzer cn。
分别在http://jakarta.apache.org/builds/jakarta-lucene/release/v1.2/lucene-1.2.zip和http://marc.theaimsgroup.com/?l=lucene-dev&m=100705753831746&q=p3
2.解开lucene-1.2.zip到任何目录下,可以看到有lucene-demos-1.2.jar和luceneweb.war这2个文件。把luceneweb.war拷贝到resin的webapp目录下。把lucene-demos-1.2.jar加入到jbuilder6的lib中。
3.在lucene-1.2.zip解开的目录下还有lucene-1.2.jar,加入到jbuilder6的lib中。同时,在jbuilder6中建一个项目,包含以上加入的lib,加入yysun写的cn Analyzer源代码。编译后打包,生成新的lucene-1.2.jar(也可以单独作一个包lucene-1.2cn.jar),包括原来的standard和de还有新的cn Analyzer,以代替原来的lucene-1.2.jar。把新做好的lucene覆盖resin/webapp/luceneweb.war中的原来的lucene-1.2.jar;为了方便,把jbuilder使用的那个也覆盖了。
4.在解开lucene-1.2.zip的目录的src/demo/org/apache/lucene/demo下把IndexHTML.java也加入到步骤5中生成的项目中。在该文件中寻找Analyzer,一共有2处。在第一处"import org.apache.lucene.analysis.standard.StandardAnalyzer;"下面加一行"import org.apache.lucene.analysis.cn.ChineseAnalyzer;",把第2处"writer = new IndexWriter(index, new StandardAnalyzer(), create);"删除或者注释掉,换成"writer = new IndexWriter(index, new ChineseAnalyzer(), create);",修改项目的应用的运行主类为org.apache.lucene.demo.IndexHTML,运行参数为-create -index /index /root。其中/index表示索引文件存放的位置(这里表示在该项目相同的分区的根目录的子目录index下),/root表示你需要建立查找索引的文件所在的位置(是文件目录形式,一般为你需要建立全文搜索的站点的根,可以搜索到子目录下的文件,可以是任何文本格式的文件,如html、txt,不支持url,但是可以自行修改源代码添加这个特性。同样,你也可以实现自己的indexer代替IndexHTML以制作如doc,rtf,pdf等的索引)。执行Run操作后,可以看到,index目录下已经建立了许多索引文件。
5.用Winzip打开已经拷贝到resin的webapp下的luceneweb.war,释放出configuration.jsp和result.jsp还有web.xml。编辑configuration.jsp,找到indexLocation这个变量,赋值成"/index"(或者你自己建立的索引的目录名称);编辑result.jsp,找到"Analyzer analyzer = new StopAnalyzer();",删除或者注释掉,改成"Analyzer analyzer=new org.apache.lucene.analysis.cn.ChineseAnalyzer();"。然后,在import的标签的下面,加上
<%
String CONTENT_TYPE = "text/html;
charset=utf-8";
response.setHeader("Content-Type",CONTENT_TYPE);
request.setCharacterEncoding("utf-8");
%>
解决编码问题。然后修改web.xml,在webapp这个元素中加上属性 character-encoding="utf-8"(即这样<web-app character-encoding="utf-8" >)。这样子就可以与jsp和具体的编码无关了。把编辑过的上述文件用winzip重新加入到luceneweb.war中去。
6.启动resin,会自动解包。在浏览器中键入"http://localhost/luceneweb/"(注意你自己的resin服务器使用的端口),可以看到输入界面。键入你希望查找的中文或者英文,如果存在应该可以找得到并且会列出url列表和部分信息。如果你的目录设置正确,可以通过url连结打开找到的文件。
7.cn Analyzer只是区分了英文数字和其它字符。也就是说,如果是letter或者数字,就读一个byte,如果是其他字符,就读2个byte。这样如果你的文件中有日文和韩文等也是可以找的到的。但是,中文的语义匹配就不可能了,只能做到单字查找。Analyzer就是通过一系列的过滤,得到TokenStream建立索引的。我们完全可以建立自己的索引生成器,如数据库的(有人写过mysql的,但是还没有发布)、Xml的(已经有lucene_xml)等等,而且lucene的搜索速度很快。