最近在弄Nutch1.2,实现关键字高亮,却发现标题关键字高亮的方法,国内网站上的都是错的,最终在nutch.apache.org网站找到了相近的代码,进行修改,终于成功完成
关键字的高亮需要自己再创建一个分词器,关键的类是TokenStream,lucene3.0以上需要用到TermAttribute。
一、内容关键字高亮很简单,修改include/style.html即可:
.highlight {
color:#FF0000;
}
二、标题关键字高亮的方法:
我们从内容关键字高亮的方法可以得到启发:
首先来看这一句:
String summary = summaries[i].toHtml(true);
这个是调用了org.apache.nutch.searcher.Summary方法
public String toHtml(boolean encode){...}
这是标题的获取方法
String title = detail.getValue("title");
我们可不可以也像summary一样调用呢,答案是肯定的,但是,nutch本身并未提标题关键字高亮的方法,这里需要我们写类和方法。
新建Titler.java
package org.apache.nutch.searcher;
import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.HashSet;
import org.apache.hadoop.conf.Configurable;
import org.apache.hadoop.conf.Configuration;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.Token;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.tokenattributes.TermAttribute;
import org.apache.lucene.analysis.tokenattributes.TypeAttribute;
import org.apache.nutch.analysis.NutchDocumentAnalyzer;
import org.apache.nutch.searcher.Summary.Fragment;
public class Titler implements Configurable {
private int maxLength = 40;
private Analyzer analyzer = null;
private Configuration conf = null;
public Titler(Configuration conf) {
setConf(conf);
}
public Configuration getConf() {
return conf;
}
public void setConf(Configuration conf) {
this.conf = conf;
this.analyzer = new NutchDocumentAnalyzer(conf);
this.maxLength = conf.getInt("searcher.title.maxlength", 40);
}
public Summary getSummary(String text, Query query) {
Token[] tokens = getTokens(text); // parse text to token array
if (tokens.length == 0)
return new Summary();
String[] terms = query.getTerms();
HashSet highlight = new HashSet(); // put query terms in table
for (int i = 0; i < terms.length; i++)
highlight.add(terms[i]);
Summary s = new Summary();
for (int i = 0; i < tokens.length && i < maxLength; i++) {
Token token = tokens[i];
//
// If we find a term that's in the query...
//
if (highlight.contains(token.term())) {
s.add(new Highlight(token.term()));
}else{
s.add(new Fragment(token.term()));
}
}
return s;
}
/** A highlighted fragment of text within a summary. */
public static class Highlight extends Fragment {
/** Constructs a highlighted fragment for the given text. */
public Highlight(String text) {
super(text);
}
/** Returns true. */
public boolean isHighlight() {
return true;
}
}
private Token[] getTokens(String text) {
ArrayList result = new ArrayList();
TokenStream ts = analyzer.tokenStream("title", new StringReader(text));
TermAttribute termAtt = (TermAttribute) ts
.getAttribute(TermAttribute.class);
TypeAttribute typeAtt = (TypeAttribute) ts
.getAttribute(TypeAttribute.class);
try {
while (ts.incrementToken()) {
Token token = new Token();
token.setTermBuffer(termAtt.term());
result.add(token);
}
} catch (IOException e) {
e.printStackTrace();
}
return (Token[]) result.toArray(new Token[result.size()]);
}
}
然后在NutchBean.java,添加
private Titler titler;
public Summary getTitle(HitDetails hit, Query query) throws IOException {
return titler.getSummary(hit.getValue("title"), query);
}
public NutchBean(Configuration conf, Path dir) throws IOException {
...
this.titler = new Titler(conf);
}
我这里测试的JSP页面是新建s.jsp.如果要在原来的search.jsp页面内调用,需要修改相应的代码。
<%@ page
session="false"
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
import="java.io.*"
import="java.util.*"
import="java.net.*"
import="javax.servlet.http.*"
import="javax.servlet.*"
import="org.apache.nutch.html.Entities"
import="org.apache.nutch.metadata.Nutch"
import="org.apache.nutch.searcher.*"
import="org.apache.nutch.plugin.*"
import="org.apache.nutch.clustering.*"
import="org.apache.hadoop.conf.*"
import="org.apache.nutch.util.NutchConfiguration"
%>
<jsp:include page="/show/include/style.html"/>
<%
String keyword = "贵阳pep艺术中心― 中心简介";
String crawl = "/home/961a/workspace/test/Nutch1.2Web/ROOT/crawl";
String summarylength = "120";
final Configuration conf = NutchConfiguration.create();
conf.set("searcher.dir", crawl);
conf.set("searcher.summary.length", summarylength);
final NutchBean bean = new NutchBean(conf);
try {
final Query query = Query.parse(keyword, conf);
query.getParams().setMaxHitsPerDup(0);
final Hits hits = bean.search(query);
out.println("Total hits: " + hits.getTotal() + " keyword:贵阳pep艺术中心― 中心简介;<BR>");
final int length = (int) Math.min(hits.getLength(), 10);
final Hit[] show = hits.getHits(0, length);
final HitDetails[] details = bean.getDetails(show);
final Summary[] summaries = bean.getSummary(details, query);
for (int i = 0; i < hits.getLength(); i++) {
String url = Entities.encode(details[i].getValue("url"));
String title = bean.getTitle(details[i], query).toHtml(true);
String summary = summaries[i].toHtml(true);
%>
<p>
<span class="title"><a href="<%=url%>"><%=title%></a></span>
<br>
<span class="bodytext"><%=summary%></span>
<br>
<span class="url"><%=Entities.encode(details[i].getValue("url"))%></span>
</p>
<%
}
} catch (Throwable t) {
}%>
- 大小: 365.8 KB
分享到:
相关推荐
1. **导入项目**:在Eclipse中选择“File” > “Import” > “Existing Projects into Workspace”,然后浏览到下载的`nutch1.2+Project`目录,导入项目。 2. **添加库**:确保你的Eclipse环境中已经安装了Apache ...
Nutch 1.2 是一个开源的网络爬虫项目,基于 Java 编写,用于抓取互联网上的网页并建立索引。这个项目是 Apache Software Foundation 的一部分,它为大规模的数据采集提供了强大的工具。Nutch 1.2 版本相对于早期版本...
### Nutch 1.2 源码阅读深入解析 #### Crawl类核心作用与流程概览 在深入了解Nutch 1.2源码之前,我们先明确Nutch的架构和工作流程。Nutch作为一款开源搜索引擎框架,其功能涵盖网页抓取、索引构建以及查询处理。...
Nutch 1.2是该项目的一个稳定版本,提供了许多改进和优化,使得它在搜索引擎构建、数据分析等领域具有广泛应用。 一、Nutch概述 Nutch是由Apache软件基金会开发的开源Web爬虫项目,主要用于抓取互联网上的网页并...
- 在 Default output folder 设置中,将输出目录更改为 `nutch1.2/bin/tmp_nutch`。 - 转到 Libraries 标签页,点击 Add Class Folder,选择 `nutch1.2/conf` 目录。 3. **调整库顺序**: - 在 Order and Export...
nutch1.2测试文档
nutch官方简单案例,请版本是nutch-1.2.war
### Windows下cygwin+MyEclipse 8.5+Nutch1.2+Tomcat 6.0 本文旨在详细介绍如何在Windows环境下搭建基于cygwin、MyEclipse 8.5、Nutch 1.2及Tomcat 6.0的开发环境,并对每个步骤进行深入解析。 #### 一、Cygwin的...
nutch Nutch是一个由Java实现的,刚刚诞生开放源代码(open-source)的web搜索引擎。 尽管Web搜索是漫游Internet的基本要求, 但是现有web搜索引擎的数目却在下降。 并且这很有可能进一步演变成为一个公司垄断了几乎...
尝试使用Nutch 0.9和IKAnalyzer 3.1.6GA组合,但由于版本兼容性问题导致失败,因此改用Nutch 1.2和IKAnalyzer 3.2.8,并将Tomcat升级到6.0.35版本。 在Nutch 1.2中集成IKAnalyzer,需要修改NutchAnalysis.jj文件,...
nutch Nutch是一个由Java实现的,刚刚诞生开放源代码(open-source)的web搜索引擎。 尽管Web搜索是漫游Internet的基本要求, 但是现有web搜索引擎的数目却在下降。 并且这很有可能进一步演变成为一个公司垄断了几乎...
- 选择“Source”选项卡,将默认输出目录从`nutch1.2/bin`修改为`nutch1.2/_bin`。 - 对于bin文件夹,可以通过右键点击“Team” > “Restore”来恢复其内容。 3. **添加JAR包** - 通过“Add JARs”功能,将`...
在Nutch中,当它抓取到不同编码格式的网页时,如果没有正确地识别和转换这些编码,就会出现乱码现象。主要涉及以下几个方面: 1. **URL编码**:Nutch在抓取URL时,应考虑URL中可能包含的非ASCII字符。这些字符需要...
Nutch 提供了内置的高亮功能,可以通过修改或扩展其源代码来实现。例如,`HeightLighter.java` 文件可能就是用于处理高亮逻辑的类。高亮过程通常包括以下步骤: - 在查询阶段,保存用户输入的关键词。 - 在搜索...
在提供的文件中,"提高nutch运行效率的优化方法1.png"和"提高nutch运行效率的优化方法2.png"可能是展示具体优化步骤的图表,而"提高nutch运行效率的原理.png"则可能解释了Nutch运行的基本原理,这些图像可以帮助读者...
nutch Nutch是一个由Java实现的,刚刚诞生开放源代码(open-source)的web搜索引擎。 尽管Web搜索是漫游Internet的基本要求, 但是现有web搜索引擎的数目却在下降。 并且这很有可能进一步演变成为一个公司垄断了几乎...
nutch Nutch是一个由Java实现的,刚刚诞生开放源代码(open-source)的web搜索引擎。 尽管Web搜索是漫游Internet的基本要求, 但是现有web搜索引擎的数目却在下降。 并且这很有可能进一步演变成为一个公司垄断了几乎...
nutch Nutch是一个由Java实现的,刚刚诞生开放源代码(open-source)的web搜索引擎。 尽管Web搜索是漫游Internet的基本要求, 但是现有web搜索引擎的数目却在下降。 并且这很有可能进一步演变成为一个公司垄断了几乎...
Nutch是一个由Java实现的,刚刚诞生开放源代码(open-source)的web搜索引擎。 尽管Web搜索是漫游Internet的基本要求, 但是现有web搜索引擎的数目却在下降。 并且这很有可能进一步演变成为一个公司垄断了几乎所有的...