1、大部分WEB文档采用HTML格式。
2、本例用如下HTML文档
<html>
<head>
<title>
Laptop power supplies are avaliable in First class only
</title>
</head>
<body>
<h1>code,write,fly</h1>
</body>
</html>
3、使用JTidy
JTidy由Andy Quick编写的Tidy的Java版本。
public class JTidyHTMLHandler implements DocumentHandler{
publicorg.apache.lucene.document.Document getDocument(InputStreamis)
throwsDocumentHandlerException{//传入一个代表HTML文档的InputStream对象
Tidy tidy=new Tidy();
tidy.setQuiet(true);
tidy.setShowWarnings(false);
//解析代表HTML文档的InputStream对象
org.w3c.dom.Documentroot=tidy.parseDOM(is,null);
ElementrawDoc=root.getDocumentElement();
org.apache.lucene.document.Document doc=neworg.apache.lucene.document.Document();
Stringtitle=getTitle(rawDoc);//获得标题
Stringbody=getBody(rawDoc);//获得<body>和</body>之间所有元素
if((title!=null)&&(!title.equals(""))){
doc.add(Field.Text("title",title));
}
if((body!=null)&&(!body.equals(""))){
doc.add(Field.Text("body",body));
}
return doc;
}
protected String getTitle(Element rawDoc){
if(rawDoc==null){
returnnull;
}
Stringtitle="";
NodeListchildren=rawDoc.getElementsByTagName("title");
if(chidren.getLength()>0){//获得第一个<title>标志的文本
Element titleElement=((Element) children.item(0));
Text text=(Text) titleElement.getFirstChild();
if (text!=null){
title=text.getData();
}
}
returntitle;
}
protected String getBody(ELement rawDoc){
if (rawDoc==null){
return null;
}
String body="";
NodeList children=rawDoc.getElementByTagName("body");//获得<body>标志的引用
if (children.getLength()>0){
body=getText(childre.item(0));//提取<body>和</body>之间的所有文本
}
return body;
}
protected grtText(Node node){
NodeListchildren=node.getChildNodes();
StringBuffer sb=new StringBuffer();
for (inti=0;i<children.getLength();i++){//提取在特定Node对象下元素中的文本
Node children=node.getChildNodes();
StringBuffer sb=new StringBuffer();
for (int i=0;i<children.getLength();i++){
Node child=children.item(i);
switch (child.getNodeType()){
case Node.ELEMENT_NODE:
sb.append(getText(child));
sb.append(" ");
break;
case Node.TEXT_NODE:
sb.append(((Text) child).getData());
break;
}
}
returnsb.toString();
}
publicstatic void main(String args[]) throws Exception{
JTidyHTMLHandler handler=new JTidyHTMLHandler();
org.apache.lucene.document.Document doc=
handler.getDocument(new FileInputStream(new File(args[0])));
System.out.println(doc);
}
}
}
4、使用NekoHTML
NekoHTML是一个简单的HTML扫描器和标签补偿器,它使程序员可以解析并通过标准的XML接口访问HTML文档。解析器扫描HTML文件并修改开发者和计算机用户在编写HTML文档时所犯罪的大量常见错误。
public class NekoHTMLHandler implements Document{
private DOMFragmentParserparser=new DOMFragmentParser();//NEKO针对HTML的DOM解析器
public DocumentgetDocument(InputStream is) throws DocumentHandlerException{
DocumentFragment node=new HTMLDocumentImpl().createDocumentFragment();
try{
parser.parse(new InputSouce(id),node);
}
catch (IOException e){
throw new DocumentHandlerException("cannot parse HTML document",e);
}
catch (SAXException e){
throw new DocumentHandlerException("cannot parse HTMLdocument",e);
}
org.apache.lucene.document.Document doc=
new org.apache.lucene.document.Document();
//提取/存储title中的文本
StringBuffer sb=new StringBuffer();
getText(sb,node,"title");
String title=sb.toString();
//清空stringbuffer
sb.setLength(0);
//从DOM NODE对象中提取出所有文本
getText(sb,node);
String text=sb.toString();
if((title!=null)&&(!title.equals(""))){
doc.add(Field.Text("title",title));
}
if((body!=null)&&(!body.equals(""))){
doc.add(Field.Text("body",text));
}
return doc;
}
private void getText(StringBuffer sb,Nodenode){
if (node.getNodeType()==Node.TEXT_NODE){//从DOMNode对象中提取出表示特定元素的所有文本
sb.append(node.getNodeValue());
}
Nodelist children=node.getChildNodes();
if (children!=null){
int len=children.getLength();
for (int i=0;i<len;i++){
getText(sb,children.item(i));
}
}
}
private booleangetText(StringBuffer sb,Node node,String element){
//从Node对象中提取表示特定元素的所有文本
if (node.getNodeType()==Node.ELEMENT_NODE){
if(element.equalsIgnoreCase(node.getNodeName())){
getText(sb,node);
return true;
}
}
NodeList children=node.getChildNodes();
if (children!=null){
intlen=chidren.getLength();
for (int i=0;i<len;i++){
if (getText(sb,children.item(i)),element){
return true;
}
}
}
return false;
}
public static void main(String args[]) throwsException{
NekoHTMLHandler handler=new NekoHTMLHandler();
org.apache.lucene.document.Document doc=
handler.getDocument(new FileInputStream(new File(args[0])));
System.out.println(doc);
}
}
相关推荐
包含翻译后的API文档:lucene-core-7.2.1-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.apache.lucene:lucene-core:7.2.1; 标签:apache、lucene、core、中文文档、jar包、java; 使用方法:解压翻译后的API...
- **文档处理增强**:引入了对PDF、HTML等更多文件格式的支持,使得Lucene可以处理更广泛的数据源。 - **多线程支持**:在3.0系列中,Lucene增强了对多线程环境的支持,允许并发索引和检索操作,提升性能。 3. **...
4. **文档处理**:能读取和索引多种格式的文件,如HTML、PDF、Word等,使得索引内容多样化。 5. **实时搜索**:Lucene的索引更新可以在短时间内完成,实现动态索引和实时搜索。 6. **内存和磁盘管理**:通过缓存...
7. **更新和删除索引**:Lucene支持动态更新索引,当文档内容发生变化时,可以快速地反映到索引中;同样,也可以方便地从索引中删除文档。 8. **多线程支持**:在Windows环境下,Lucene可以利用多核处理器的优势,...
5. **文档处理**:支持多种文档格式的读取,如PDF、HTML等,方便从各种源获取和索引文本。 三、Lucene工作原理 1. **文档索引**:首先,Lucene会对输入的文档进行分析,将文本分解为关键词(术语),然后这些术语...
- **索引(Index)**: Lucene 首先对文档内容进行分析和处理,生成倒排索引(Inverted Index),这是一种将单词映射到包含该单词的文档集合的数据结构,便于快速查找包含特定单词的文档。 - **分词器(Tokenizer)...
在Lucene的众多组件中,Highlighter模块扮演着重要角色,它能够帮助我们从搜索结果中提取出与查询关键词相关的片段,使用户能够快速理解文档的关键内容。本文将深入探讨Lucene 4.4.0版本中的Highlighter模块,了解其...
Lucene的核心功能包括文档的索引和搜索,支持多种类型的文档,如文本、HTML、PDF等。它的工作原理是将文档内容转化为结构化的索引形式,便于快速查询。索引过程包括分词(Tokenization)、词干提取(Stemming)、...
它的核心功能包括文档的索引、搜索以及相关的高级特性。其中,"lucene-analysis.jar"是Lucene项目中的一个重要组件,主要负责文本的预处理工作,即文本分析。本文将深入探讨这个jar包及其包含的文件,以揭示其在...
Lucene支持索引多种文件格式,包括HTML、PDF、DOC等,并且具备分词、布尔查询、短语查询等多种功能。 **二、构建Web搜索程序的基本步骤** 1. **设置环境**:首先,你需要在你的开发环境中安装Java和Apache Maven...
2. 分区索引(Segmented Index):Lucene采用分段索引策略,每个段都是一个独立的、完整的索引,这使得添加新文档和更新操作变得高效。4.8.0版本对段合并策略进行了优化,提升了整体性能。 3. 倒排索引(Inverted ...
5. **文档处理**:新版本可能增强了对不同文档格式的支持,如PDF、Word、HTML等,使得非文本数据的全文检索成为可能。 6. **API改进**:Lucene的API通常会随着版本迭代而变得更为友好和完善,8.9.0可能会提供更简洁...
《深入理解Luke:洞察Lucene索引文件》 在信息技术领域,搜索引擎的高效运作离不开对数据的快速检索,而Lucene作为开源全文检索库,扮演了核心角色。在这个过程中,Luke工具提供了一种直观的方式,让我们能够查看和...
4. **文档处理**:Lucene支持多种格式的文档,如HTML、PDF等。在新版本中,文档解析和内容提取能力可能有所增强,能更好地处理各种类型的文档内容。 除了这些基础功能,Linux Lucene 8.8.0还可能引入了以下新特性:...
10. **文档和示例**: 官方文档通常会详尽地介绍如何在Linux环境中安装、配置和使用Lucene 8.7.0。开发者可以通过阅读文档、查看示例代码来快速上手。 总的来说,Linux Lucene 8.7.0是一个强大且灵活的文本搜索工具...
- 官方下载页面: [http://lucene.apache.org/downloads.html](http://lucene.apache.org/downloads.html) #### 解压与配置 1. **解压**: 将下载的压缩包解压到期望的目录下。 2. **环境配置**: - **Java环境**: ...
例如,他们首先会使用`lucene-core`来分析和索引文档内容,然后通过`lucene-memory`在内存中管理索引以实现快速搜索,最后使用`lucene-highlighter`来提高用户体验,显示搜索关键词的高亮结果。 Java Lucene 3.0的...
通过建立倒排索引,Lucene能够在大量数据中快速找到匹配的文档,使得全文检索变得简单且高效。对于Java开发者而言,集成Lucene能极大地提升应用程序的搜索功能,使其在处理文本数据时具备强大的处理能力。了解并掌握...
网络机器人需要解析HTML文档以提取有用的信息。Lucene虽然不直接处理HTML解析,但可以与HTML解析库(如Jsoup)结合,将HTML内容转化为适合索引的文本。 3.2.2 URL管理 网络机器人需要管理已访问和待访问的URL集合...