分享
 
 
 

使用Lucene进行全文检索(二)---得到有效的内容

王朝java/jsp·作者佚名  2006-01-10
窄屏简体版  字體: |||超大  

scud(飞云小侠) http://www.jscud.com 转载请注明来源/作者

关键字:lucene,html parser,全文检索,IndexReader,Document,Field,IndexWriter,Term,HTMLPAGE

在使用lucene对相关内容进行索引时,会遇到各种格式的内容,例如Html,PDF,Word等等,那么我们如何从这么文档中得到我们需要的内容哪?例如Html的内容,一般我们不需要对Html标签建立索引,因为那不是我们需要搜索的内容.这个时候,我们就需要从Html内容中解析出我们所需要的内容.对于PDF,Word文档,也是类似的要求.

总之,我们只需要从内容中提取出我们需要的文本来建立索引,这样用户就能搜索到需要的内容,然后访问对应的资源即可.

Lucene本身带的例子中有一个解析Html的代码,不过不是纯JAVA的,所以在网上我又找到了另外一个Html解析器,网址如下:http://htmlparser.sourceforge.net.

对PDF解析的相关项目有很多,例如PDFBox.在PDFBox里面提出pdf的文本内容只需要一句话即可:

Document doc = LucenePDFDocument.getDocument( file );

当然如果需要更高级的设置,就要使用PDFBox中PDFTextStripper等类来实现更高级的操作了.

对Word文档解析的相关有POI,网址是 http://jakarta.apache.org/poi/.

HtmlParser本身提供的功能很强大,我们下面主要来关注我们需要的功能.首先给出几个函数如下:

/**

* 解析一个Html页面,返回一个Html页面类.

*

* @param resource 文件路径或者网址

*/

public static SearchHtmlPage parseHtmlPage(String resource)

{

String title = "";

String body = "";

try

{

Parser myParser = new Parser(resource);

//设置编码:根据实际情况修改

myParser.setEncoding("GBK");

HtmlPage visitor = new HtmlPage(myParser);

myParser.visitAllNodesWith(visitor);

title = visitor.getTitle();

body = combineNodeText(visitor.getBody().toNodeArray());

}

catch (ParserException e)

{

LogMan.error("Parse Html Page " + resource + " Error!");

}

SearchHtmlPage result = new SearchHtmlPage(title, body);

return result;

}

/**

* 解析Html内容,得到普通文本和链接的内容.

*

* @param content 要解析的内容

* @return 返回解析后的内容

*/

public static String parseHtmlContent(String content)

{

Parser myParser;

NodeList nodeList = null;

myParser = Parser.createParser(content, "GBK");

NodeFilter textFilter = new NodeClassFilter(TextNode.class);

NodeFilter linkFilter = new NodeClassFilter(LinkTag.class);

//暂时不处理 meta

//NodeFilter metaFilter = new NodeClassFilter(MetaTag.class);

OrFilter lastFilter = new OrFilter();

lastFilter.setPredicates(new NodeFilter[] { textFilter, linkFilter });

try

{

nodeList = myParser.parse(lastFilter);

}

catch (ParserException e)

{

LogMan.warn("Parse Content Error", e);

}

//中场退出了

if (null == nodeList)

{

return "";

}

Node[] nodes = nodeList.toNodeArray();

String result = combineNodeText(nodes);

return result;

}

//合并节点的有效内容

private static String combineNodeText(Node[] nodes)

{

StringBuffer result = new StringBuffer();

for (int i = 0; i < nodes.length; i++)

{

Node anode = (Node) nodes[i];

String line = "";

if (anode instanceof TextNode)

{

TextNode textnode = (TextNode) anode;

//line = textnode.toPlainTextString().trim();

line = textnode.getText();

}

else if (anode instanceof LinkTag)

{

LinkTag linknode = (LinkTag) anode;

line = linknode.getLink();

//过滤jsp标签

line = StringFunc.replace(line, "<%.*%>", "");

}

if (StringFunc.isTrimEmpty(line)) continue;

result.append(" ").append(line);

}

return result.toString();

}

其中SearchHtmlPage类是表示一个Html页面的模型,包含标题和内容,代码如下:

package com.jscud.www.support.search;

/**

* 搜索时解析Html后返回的页面模型.

*

* @author scud(飞云小侠) http://www.jscud.com

*

*/

public class SearchHtmlPage

{

/**标题*/

private String title;

/**内容*/

private String body;

public SearchHtmlPage(String title, String body)

{

this.title = title;

this.body = body;

}

public String getBody()

{

return body;

}

public void setBody(String body)

{

this.body = body;

}

public String getTitle()

{

return title;

}

public void setTitle(String title)

{

this.title = title;

}

}

当然,使用HtmlParser解析Html资源还有很多其他的方法,可以设置很多的条件来满足用户的解析要求,用户可以阅读其他的文章或者HtmlParser的文档来了解,在此不多介绍.

下一节讲解如何进行搜索.

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有