Lucene 2.2.0发行包中自带的org.apache.lucene.demo包中,有一个为HTML和TXT文件建立索引、删除索引以及实现检索的实例,其中在org.apache.lucene.demo.html包中的一些类,是真正解析HTML文件的工具类,包括解析类、预定义类、异常处理类。
这个例子的命令提示为:
IndexHTML [-create] [-index <index>] <root_directory>
是建关于索引的命令,-create是建立索引,-index是选择删除指定的索引文件。
这个例子运行过程如下所示。
将相关jar包luene-core-2.2.0.jar和lucene-demos-2.2.0.jar加入到当前的CLASSPATH中,设置环境变量:
E:\Lucene\lucene-2.2.0\lucene-2.2.0\lu
ene-core-2.2.0.jar;E:\Lucene\lucene-2.2.0\lucene-2.2.0\lucene-demos-2.2.0.jar;
假设,待处理的文件存放于目录E:\data\page\cn_en下面,文件列表如下所示:
2008-06-11 10:20 <DIR> eNet网络学院-中国权威电脑教程软件资讯网站.files
2008-06-11 10:20 <DIR> hao123网址之家--实用网址,搜索大全,尽在www_hao123_com.files
2008-06-11 10:20 <DIR> 设计联盟_中国 Cndu_cn [国内专业的设计师交流平台_ 华人设计精英的社交圈] - 为设计师服务!.files
2008-06-11 10:20 <DIR> 设计路上酷站收藏大全,酷站欣赏,韩国网站欣赏,欧美网站,国内网站欣赏,设计欣赏,网页设计,网站建设,平面设计,韩国矢量素材下载.files
2008-06-11 10:20 <DIR> 设计在线_中国 DesignOnLine.files
2008-06-11 10:20 <DIR> 素材下载-图片下载-中国下载站_files
2008-06-11 10:20 <DIR> 天龙八部 官方网站首页.files
2008-06-11 10:20 <DIR> 网站优化搜索引擎优化网站排名研究论坛seo资料.files
2008-06-11 10:20 <DIR> 中国设计网址大全 52design设计网网址库.files
2008-06-11 10:20 <DIR> 中国设计网址导航-中国设计网站大全-中国设计网址大全-中国设计名站大全-数字艺术网址大全-中国领先的数字艺术网址门户.files
2008-06-11 10:20 <DIR> 中国设计之窗-- 首页.files
2007-12-09 20:26 187,187 eNet网络学院-中国权威电脑教程软件资讯网站.htm
2007-12-10 13:20 61,480 hao123网址之家--实用网址,搜索大全,尽在www_hao123_com.htm
2007-12-09 20:25 71,696 设计联盟_中国 Cndu_cn [国内专业的设计师交流平台_ 华人设计精英的社交圈] - 为设计师服务!.htm
2007-12-09 20:56 107,597 设计路上酷站收藏大全,酷站欣赏,韩国网站欣赏,欧美网站,国内网站欣赏,设计欣赏,网页设计,网站建设,平面设计,韩国矢量素材下载.htm
2007-12-09 20:41 606 设计在线_中国 DesignOnLine.htm
2008-01-18 16:18 58,838 素材下载-图片下载-中国下载站.htm
2007-12-10 13:22 204,945 天龙八部 官方网站首页.htm
2007-12-10 13:19 31,935 网站优化搜索引擎优化网站排名研究论坛seo资料.htm
2007-12-09 20:25 206,758 中国设计网址大全 52design设计网网址库.htm
2007-12-09 20:14 84,347 中国设计网址导航-中国设计网站大全-中国设计网址大全-中国设计名站大全-数字艺术网址大全-中国领先的数字艺术网址门户.htm
2007-12-09 20:26 280,887 中国设计之窗-- 首页.htm
2008-06-11 10:40 <DIR> Welcome! - The Apache Software Foundation.files
2008-06-11 10:38 18,241 Welcome! - The Apache Software Foundation.htm
2008-06-11 10:40 <DIR> Sun Microsystems.files
2008-06-11 10:39 26,446 Sun Microsystems.htm
2008-06-11 10:40 <DIR> Microsoft Corporation.files
2008-06-11 10:40 44,352 Microsoft Corporation.htm
2007-06-16 22:21 83,829 CHANGES.txt
2007-06-16 22:21 11,358 LICENSE.txt
2007-06-16 22:21 362 NOTICE.txt
2007-06-16 22:21 1,157 README.txt
2007-06-16 22:21 3,676 BUILD.txt
2007-10-23 15:12 34 2实验红黑树.txt
2007-10-30 15:44 82 3实验题目.txt
2007-12-09 21:15 8,479 Dreamweaver 8 序列号.txt
2007-10-13 19:48 62 EditPlus注册码.txt
2007-08-02 19:46 7,738 文档规范.txt
2008-03-03 21:17 0 资料列表.txt
2007-10-16 15:33 75 1实验题目.txt
26 个文件 1,502,167 字节
16 个目录 207,020,032 可用字节
建立索引
启动cmd.exe,执行建立索引的命令,如下:
E:\data\page>java org.apache.lucene.demo.IndexHTML -create cn_en
建立索引信息如下所示:
adding cn_en/1实验题目.txt
adding cn_en/2实验红黑树.txt
adding cn_en/3实验题目.txt
adding cn_en/BUILD.txt
adding cn_en/CHANGES.txt
adding cn_en/Dreamweaver 8 序列号.txt
adding cn_en/EditPlus注册码.txt
adding cn_en/LICENSE.txt
adding cn_en/Microsoft Corporation.htm
Parse Aborted: Lexical error at line 699, column 291. Encountered: "=" (61), af
ter : ""
adding cn_en/NOTICE.txt
adding cn_en/README.txt
adding cn_en/Sun Microsystems.htm
adding cn_en/Welcome! - The Apache Software Foundation.htm
adding cn_en/eNet网络学院-中国权威电脑教程软件资讯网站.files/adjuggler.htm
adding cn_en/eNet网络学院-中国权威电脑教程软件资讯网站.files/articlemaquree.htm
l
adding cn_en/eNet网络学院-中国权威电脑教程软件资讯网站.files/enetshow(1).htm
adding cn_en/eNet网络学院-中国权威电脑教程软件资讯网站.files/enetshow(2).htm
adding cn_en/eNet网络学院-中国权威电脑教程软件资讯网站.files/enetshow(3).htm
adding cn_en/eNet网络学院-中国权威电脑教程软件资讯网站.files/enetshow.htm
adding cn_en/eNet网络学院-中国权威电脑教程软件资讯网站.files/menu.html
adding cn_en/eNet网络学院-中国权威电脑教程软件资讯网站.files/rdzt.html
Parse Aborted: Lexical error at line 5, column 11. Encountered: "\u8f6f" (36719
), after : ""
adding cn_en/eNet网络学院-中国权威电脑教程软件资讯网站.htm
adding cn_en/hao123网址之家--实用网址,搜索大全,尽在www_hao123_com.htm
Parse Aborted: Lexical error at line 579, column 38. Encountered: "\u6b22" (274
26), after : ""
adding cn_en/中国设计之窗-- 首页.files/index3.htm
Parse Aborted: Lexical error at line 107, column 57. Encountered: "\u6807" (266
31), after : ""
adding cn_en/中国设计之窗-- 首页.files/spider_search_show.htm
Parse Aborted: Lexical error at line 6, column 12. Encountered: "\u5546" (21830
), after : ""
adding cn_en/中国设计之窗-- 首页.htm
adding cn_en/中国设计网址大全 52design设计网网址库.files/flashv2.htm
adding cn_en/中国设计网址大全 52design设计网网址库.files/go.htm
Parse Aborted: Lexical error at line 7, column 9. Encountered: "\u7f51" (32593)
, after : ""
adding cn_en/中国设计网址大全 52design设计网网址库.htm
Parse Aborted: Encountered "<EOF>" at line 1, column 123.
Was expecting one of:
<ScriptText> ...
<ScriptEnd> ...
adding cn_en/中国设计网址导航-中国设计网站大全-中国设计网址大全-中国设计名站大全
-数字艺术网址大全-中国领先的数字艺术网址门户.files/90.htm
Parse Aborted: Lexical error at line 86, column 25. Encountered: "\u666f" (2622
3), after : ""
adding cn_en/中国设计网址导航-中国设计网站大全-中国设计网址大全-中国设计名站大全
-数字艺术网址大全-中国领先的数字艺术网址门户.files/alimama.htm
adding cn_en/中国设计网址导航-中国设计网站大全-中国设计网址大全-中国设计名站大全
-数字艺术网址大全-中国领先的数字艺术网址门户.files/img.htm
adding cn_en/中国设计网址导航-中国设计网站大全-中国设计网址大全-中国设计名站大全
-数字艺术网址大全-中国领先的数字艺术网址门户.files/newsite.htm
adding cn_en/中国设计网址导航-中国设计网站大全-中国设计网址大全-中国设计名站大全
-数字艺术网址大全-中国领先的数字艺术网址门户.files/soft.htm
adding cn_en/中国设计网址导航-中国设计网站大全-中国设计网址大全-中国设计名站大全
-数字艺术网址大全-中国领先的数字艺术网址门户.files/stat.htm
Parse Aborted: Lexical error at line 25, column 99. Encountered: "\u957f" (3827
1), after : ""
Parse Aborted: Lexical error at line 6, column 10. Encountered: "\u4e2d" (20013
), after : ""
adding cn_en/中国设计网址导航-中国设计网站大全-中国设计网址大全-中国设计名站大全
-数字艺术网址大全-中国领先的数字艺术网址门户.htm
adding cn_en/天龙八部 官方网站首页.files/dma.htm
Parse Aborted: Encountered "\'" at line 329, column 56.
Was expecting one of:
<ArgName> ...
"=" ...
<TagEnd> ...
adding cn_en/天龙八部 官方网站首页.files/index.htm
adding cn_en/天龙八部 官方网站首页.files/rcc.htm
Parse Aborted: Encountered "\'" at line 329, column 56.
Was expecting one of:
<ArgName> ...
"=" ...
<TagEnd> ...
Parse Aborted: Lexical error at line 5, column 16. Encountered: "\u5929" (22825
), after : ""
adding cn_en/天龙八部 官方网站首页.htm
adding cn_en/文档规范.txt
Parse Aborted: Lexical error at line 3, column 26. Encountered: "\u7d20" (32032
), after : ""
adding cn_en/素材下载-图片下载-中国下载站.htm
Parse Aborted: Lexical error at line 4, column 15. Encountered: "\u6536" (25910
), after : ""
adding cn_en/网站优化搜索引擎优化网站排名研究论坛seo资料.htm
Parse Aborted: Lexical error at line 9, column 25. Encountered: "\u9645" (38469
), after : ""
adding cn_en/设计在线_中国 DesignOnLine.files/gra.dolcn.files/adframe.htm
Parse Aborted: Lexical error at line 144, column 14. Encountered: "\u641c" (256
28), after : ""
adding cn_en/设计在线_中国 DesignOnLine.files/gra.dolcn.htm
Parse Aborted: Lexical error at line 5, column 15. Encountered: "\u534e" (21326
), after : ""
adding cn_en/设计在线_中国 DesignOnLine.htm
adding cn_en/设计联盟_中国 Cndu_cn [国内专业的设计师交流平台_ 华人设计精英的社交
圈] - 为设计师服务!.files/stat.htm
Parse Aborted: Lexical error at line 25, column 100. Encountered: "\u957f" (382
71), after : ""
Parse Aborted: Lexical error at line 3, column 135. Encountered: "\u4e49" (2004
1), after : ""
adding cn_en/设计联盟_中国 Cndu_cn [国内专业的设计师交流平台_ 华人设计精英的社交
圈] - 为设计师服务!.htm
adding cn_en/设计路上酷站收藏大全,酷站欣赏,韩国网站欣赏,欧美网站,国内网站欣赏,设
计欣赏,网页设计,网站建设,平面设计,韩国矢量素材下载.files/go.htm
adding cn_en/设计路上酷站收藏大全,酷站欣赏,韩国网站欣赏,欧美网站,国内网站欣赏,设
计欣赏,网页设计,网站建设,平面设计,韩国矢量素材下载.files/indexLogin.htm
adding cn_en/设计路上酷站收藏大全,酷站欣赏,韩国网站欣赏,欧美网站,国内网站欣赏,设
计欣赏,网页设计,网站建设,平面设计,韩国矢量素材下载.files/stat.htm
Parse Aborted: Lexical error at line 25, column 98. Encountered: "\u957f" (3827
1), after : ""
Parse Aborted: Lexical error at line 6, column 10. Encountered: "\u9177" (37239
), after : ""
adding cn_en/设计路上酷站收藏大全,酷站欣赏,韩国网站欣赏,欧美网站,国内网站欣赏,设
计欣赏,网页设计,网站建设,平面设计,韩国矢量素材下载.htm
adding cn_en/资料列表.txt
Optimizing index...
2422 total milliseconds
对于HTML文件和TXT文件,都为他们建立了索引,并且索引文件存放在默认的index目录下(这里完整路径为E:\data\page\index)
删除重建索引
目录en下面有几个HTML文件:
2008-06-11 10:38 18,241 Welcome! - The Apache Software Foundation.htm
2008-06-11 11:00 44,349 Microsoft Corporation.htm
2008-06-11 10:39 26,446 Sun Microsystems.htm
2008-06-11 10:51 <DIR> Welcome! - The Apache Software Foundation.files
2008-06-11 10:51 <DIR> Microsoft Corporation.files
2008-06-11 10:51 <DIR> Sun Microsystems.files
3 个文件 89,036 字节
5 个目录 207,020,032 可用字节
删除原来的索引文件,并且重新为E:\data\page\en目录下的HTML文件建立索引的命令如下:
E:\data\page>java org.apache.lucene.demo.IndexHTML -index index en
信息如下所示:
deleting cn_en/1实验题目.txt
deleting cn_en/2实验红黑树.txt
deleting cn_en/3实验题目.txt
deleting cn_en/BUILD.txt
deleting cn_en/CHANGES.txt
deleting cn_en/Dreamweaver 8 序列号.txt
deleting cn_en/EditPlus注册码.txt
deleting cn_en/LICENSE.txt
deleting cn_en/Microsoft Corporation.htm
deleting cn_en/NOTICE.txt
deleting cn_en/README.txt
deleting cn_en/Sun Microsystems.htm
deleting cn_en/Welcome! - The Apache Software Foundation.htm
deleting cn_en/eNet网络学院-中国权威电脑教程软件资讯网站.files/adjuggler.htm
deleting cn_en/eNet网络学院-中国权威电脑教程软件资讯网站.files/articlemaquree.h
tml
deleting cn_en/eNet网络学院-中国权威电脑教程软件资讯网站.files/enetshow(1).htm
deleting cn_en/eNet网络学院-中国权威电脑教程软件资讯网站.files/enetshow(2).htm
deleting cn_en/eNet网络学院-中国权威电脑教程软件资讯网站.files/enetshow(3).htm
deleting cn_en/eNet网络学院-中国权威电脑教程软件资讯网站.files/enetshow.htm
deleting cn_en/eNet网络学院-中国权威电脑教程软件资讯网站.files/menu.html
deleting cn_en/eNet网络学院-中国权威电脑教程软件资讯网站.files/rdzt.html
deleting cn_en/eNet网络学院-中国权威电脑教程软件资讯网站.htm
deleting cn_en/hao123网址之家--实用网址,搜索大全,尽在www_hao123_com.htm
deleting cn_en/中国设计之窗-- 首页.files/index3.htm
deleting cn_en/中国设计之窗-- 首页.files/spider_search_show.htm
deleting cn_en/中国设计之窗-- 首页.htm
deleting cn_en/中国设计网址大全 52design设计网网址库.files/flashv2.htm
deleting cn_en/中国设计网址大全 52design设计网网址库.files/go.htm
deleting cn_en/中国设计网址大全 52design设计网网址库.htm
deleting cn_en/中国设计网址导航-中国设计网站大全-中国设计网址大全-中国设计名站大
全-数字艺术网址大全-中国领先的数字艺术网址门户.files/90.htm
deleting cn_en/中国设计网址导航-中国设计网站大全-中国设计网址大全-中国设计名站大
全-数字艺术网址大全-中国领先的数字艺术网址门户.files/alimama.htm
deleting cn_en/中国设计网址导航-中国设计网站大全-中国设计网址大全-中国设计名站大
全-数字艺术网址大全-中国领先的数字艺术网址门户.files/img.htm
deleting cn_en/中国设计网址导航-中国设计网站大全-中国设计网址大全-中国设计名站大
全-数字艺术网址大全-中国领先的数字艺术网址门户.files/newsite.htm
deleting cn_en/中国设计网址导航-中国设计网站大全-中国设计网址大全-中国设计名站大
全-数字艺术网址大全-中国领先的数字艺术网址门户.files/soft.htm
deleting cn_en/中国设计网址导航-中国设计网站大全-中国设计网址大全-中国设计名站大
全-数字艺术网址大全-中国领先的数字艺术网址门户.files/stat.htm
deleting cn_en/中国设计网址导航-中国设计网站大全-中国设计网址大全-中国设计名站大
全-数字艺术网址大全-中国领先的数字艺术网址门户.htm
deleting cn_en/天龙八部 官方网站首页.files/dma.htm
deleting cn_en/天龙八部 官方网站首页.files/index.htm
deleting cn_en/天龙八部 官方网站首页.files/rcc.htm
deleting cn_en/天龙八部 官方网站首页.htm
deleting cn_en/文档规范.txt
deleting cn_en/素材下载-图片下载-中国下载站.htm
deleting cn_en/网站优化搜索引擎优化网站排名研究论坛seo资料.htm
deleting cn_en/设计在线_中国 DesignOnLine.files/gra.dolcn.files/adframe.htm
deleting cn_en/设计在线_中国 DesignOnLine.files/gra.dolcn.htm
deleting cn_en/设计在线_中国 DesignOnLine.htm
deleting cn_en/设计联盟_中国 Cndu_cn [国内专业的设计师交流平台_ 华人设计精英的社
交圈] - 为设计师服务!.files/stat.htm
deleting cn_en/设计联盟_中国 Cndu_cn [国内专业的设计师交流平台_ 华人设计精英的社
交圈] - 为设计师服务!.htm
deleting cn_en/设计路上酷站收藏大全,酷站欣赏,韩国网站欣赏,欧美网站,国内网站欣赏,
设计欣赏,网页设计,网站建设,平面设计,韩国矢量素材下载.files/go.htm
deleting cn_en/设计路上酷站收藏大全,酷站欣赏,韩国网站欣赏,欧美网站,国内网站欣赏,
设计欣赏,网页设计,网站建设,平面设计,韩国矢量素材下载.files/indexLogin.htm
deleting cn_en/设计路上酷站收藏大全,酷站欣赏,韩国网站欣赏,欧美网站,国内网站欣赏,
设计欣赏,网页设计,网站建设,平面设计,韩国矢量素材下载.files/stat.htm
deleting cn_en/设计路上酷站收藏大全,酷站欣赏,韩国网站欣赏,欧美网站,国内网站欣赏,
设计欣赏,网页设计,网站建设,平面设计,韩国矢量素材下载.htm
deleting cn_en/资料列表.txt
adding en/Microsoft Corporation.htm
Parse Aborted: Lexical error at line 699, column 291. Encountered: "=" (61), af
ter : ""
adding en/Sun Microsystems.htm
adding en/Welcome! - The Apache Software Foundation.htm
Optimizing index...
1265 total milliseconds
在删除了原来所有的索引文件以后,又执行了重新为E:\data\page\en目录中的HTML文件建立索引的过程。
实现检索
检索的命令用法如下:
java org.apache.lucene.demo.SearchFiles [-index dir] [-field f] [-repeat n] [-queries file] [-raw] [-norms field]
检索过程为如下。
使用org.apache.lucene.demo.SearchFiles类,加上一个索引存放目录作为参数:
E:\data\page>java org.apache.lucene.demo.SearchFiles index
这时要求输入检索关键字:
Enter query:
检索copyright,检索结果如下所示:
Searching for: copyright
8 total matching documents
1. cn_en/NOTICE.txt
Title:
2. cn_en/LICENSE.txt
Title:
3. cn_en/BUILD.txt
Title:
4. cn_en/Sun Microsystems.htm
Title: Sun Microsystems
5. cn_en/Welcome! - The Apache Software Foundation.htm
Title: Welcome! - The Apache Software Foundation
6. cn_en/天龙八部 官方网站首页.files/dma.htm
Title:
7. cn_en/天龙八部 官方网站首页.files/rcc.htm
Title:
8. cn_en/CHANGES.txt
似乎由于编码问题,检索中文不能奏效,如下所示:
Enter query:
中
Searching for:
0 total matching documents
Enter query:
中国
Searching for: й
0 total matching documents
问题及说明
1、在解析HTML文件并且为其建立索引过程中,发生了类似如下的错误:
adding cn_en/Microsoft Corporation.htm
Parse Aborted: Lexical error at line 699, column 291. Encountered: "=" (61), after : ""
感觉好像是解析过程中与解析的词法不一致导致上面的错误,因此放弃了解析该处对应的HTML代码。仔细研究了一下Microsoft Corporation.htm页面代码,定位到line 699, column 291为:
<SCRIPT type=text/javascript>var gDomain="m.webtrends.com";var gDcsId="dcs4f6vsz99k7mayiw2jzupyr_1s2e";var gTrackEvents=1;var gFpc="WT_FPC";if(document.cookie.indexOf(gFpc+"=")==-1){document.write("<scr"+"ipt type='text/javascript' src='"+"http"+(window.location.protocol.indexOf('https:')==0?'s':'')+"://"+gDomain+"/"+gDcsId+"/wtid.js"+"'></scr"+"ipt>");}</SCRIPT>
是解析SCRIPT标记时出现了异常,位置就是上面红色加粗显示的等号“==”中第一个等号处。
出错处理在org.apache.lucene.demo.html.TokenMgrError类的下面方法中:
protected static String LexicalError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar) {
return("Lexical error at line " +
errorLine + ", column " +
errorColumn + ". Encountered: " +
(EOFSeen ? "<EOF> " : ("\"" + addEscapes(String.valueOf(curChar)) + "\"") + " (" + (int)curChar + "), ") +
"after : \"" + addEscapes(errorAfter) + "\"");
}
而实际发生异常,是在一个HTMLParser线程启动运行过程中捕获的,HTMLParser线程的实现如下所示:
package org.apache.lucene.demo.html;
import java.io.*;
class ParserThread extends Thread {
HTMLParser parser;
ParserThread(HTMLParser p) {
parser = p;
}
public void run() { // convert pipeOut to pipeIn
try {
try { // parse document to pipeOut
parser.HTMLDocument();
} catch (ParseException e) {
System.out.println("Parse Aborted: " + e.getMessage());
} catch (TokenMgrError e) {
System.out.println("Parse Aborted: " + e.getMessage());
} finally {
parser.pipeOut.close();
synchronized (parser) {
parser.summary.setLength(HTMLParser.SUMMARY_LENGTH);
parser.titleComplete = true;
parser.notifyAll();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
org.apache.lucene.demo.html.HTMLParserTokenManager类是解析HTML的核心类,个人认为,之所以出现上面的词法错误,可能是这个org.apache.lucene.demo.html.HTMLParserTokenManager的设计中存在漏洞吧,因为HTML文件的代码是在是太复杂,有时HTML标签又不是特别规范,而浏览器的容错能力又很好,所以实现解析应该是很困难的一件事情。
2、在demo中有个测试类Test 实现了提取HTML文件的Title、Summary、Content的方案,如下所示:
package org.apache.lucene.demo.html;
import java.io.*;
class Test {
public static void main(String[] argv) throws IOException, InterruptedException {
if ("-dir".equals(argv[0])) {
String[] files = new File(argv[1]).list();
java.util.Arrays.sort(files);
for (int i = 0; i < files.length; i++) {
System.err.println(files[i]);
File file = new File(argv[1], files[i]);
parse(file);
}
} else
parse(new File(argv[0]));
}
public static void parse(File file) throws IOException, InterruptedException {
FileInputStream fis = null;
try {
fis = new FileInputStream(file);
HTMLParser parser = new HTMLParser(fis);
System.out.println("Title: " + Entities.encode(parser.getTitle()));
System.out.println("Summary: " + Entities.encode(parser.getSummary()));
System.out.println("Content:");
LineNumberReader reader = new LineNumberReader(parser.getReader());
for (String l = reader.readLine(); l != null; l = reader.readLine())
System.out.println(l);
} finally {
if (fis != null) fis.close();
}
}
}
可以在此基础上指导自己使用HTMLParser。