`
jasorel
  • 浏览: 802 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Nutch1.2标题关键字高亮的正确方法

阅读更多
最近在弄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 楼 w156445045 2013-03-18  
博主您好,非常感谢您提供的文章。
在这里,想问楼主一个问题,谢谢了先。
我使用Nutch抓取了很多网页之后,如何使用Lucene进行索引呢?
谢谢。

相关推荐

    nutch1.2 java的project

    1. **导入项目**:在Eclipse中选择“File” &gt; “Import” &gt; “Existing Projects into Workspace”,然后浏览到下载的`nutch1.2+Project`目录,导入项目。 2. **添加库**:确保你的Eclipse环境中已经安装了Apache ...

    nutch1.2 java project

    Nutch 1.2 是一个开源的网络爬虫项目,基于 Java 编写,用于抓取互联网上的网页并建立索引。这个项目是 Apache Software Foundation 的一部分,它为大规模的数据采集提供了强大的工具。Nutch 1.2 版本相对于早期版本...

    Nutch 1.2源码阅读

    ### Nutch 1.2 源码阅读深入解析 #### Crawl类核心作用与流程概览 在深入了解Nutch 1.2源码之前,我们先明确Nutch的架构和工作流程。Nutch作为一款开源搜索引擎框架,其功能涵盖网页抓取、索引构建以及查询处理。...

    nutch1.2源码

    Nutch 1.2是该项目的一个稳定版本,提供了许多改进和优化,使得它在搜索引擎构建、数据分析等领域具有广泛应用。 一、Nutch概述 Nutch是由Apache软件基金会开发的开源Web爬虫项目,主要用于抓取互联网上的网页并...

    myeclipse8.5导入nutch1.2源码

    - 在 Default output folder 设置中,将输出目录更改为 `nutch1.2/bin/tmp_nutch`。 - 转到 Libraries 标签页,点击 Add Class Folder,选择 `nutch1.2/conf` 目录。 3. **调整库顺序**: - 在 Order and Export...

    nutch1.2测试文档

    nutch1.2测试文档

    nutch-1.2.war

    nutch官方简单案例,请版本是nutch-1.2.war

    Windows下cygwin+MyEclipse 8.5+Nutch1.2+Tomcat 6.0

    ### Windows下cygwin+MyEclipse 8.5+Nutch1.2+Tomcat 6.0 本文旨在详细介绍如何在Windows环境下搭建基于cygwin、MyEclipse 8.5、Nutch 1.2及Tomcat 6.0的开发环境,并对每个步骤进行深入解析。 #### 一、Cygwin的...

    nutch-1.2.part02

    nutch Nutch是一个由Java实现的,刚刚诞生开放源代码(open-source)的web搜索引擎。 尽管Web搜索是漫游Internet的基本要求, 但是现有web搜索引擎的数目却在下降。 并且这很有可能进一步演变成为一个公司垄断了几乎...

    实验报告(利用Nutch和IKanalyzer构造中文分词搜索引擎)

    尝试使用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-1.2.part06

    nutch Nutch是一个由Java实现的,刚刚诞生开放源代码(open-source)的web搜索引擎。 尽管Web搜索是漫游Internet的基本要求, 但是现有web搜索引擎的数目却在下降。 并且这很有可能进一步演变成为一个公司垄断了几乎...

    Nutch搜索引擎培训讲义

    - 选择“Source”选项卡,将默认输出目录从`nutch1.2/bin`修改为`nutch1.2/_bin`。 - 对于bin文件夹,可以通过右键点击“Team” &gt; “Restore”来恢复其内容。 3. **添加JAR包** - 通过“Add JARs”功能,将`...

    nutch部分网页乱码BUG修正

    在Nutch中,当它抓取到不同编码格式的网页时,如果没有正确地识别和转换这些编码,就会出现乱码现象。主要涉及以下几个方面: 1. **URL编码**:Nutch在抓取URL时,应考虑URL中可能包含的非ASCII字符。这些字符需要...

    nutch解决搜索结果高亮和网页快照链接无效及网页变形

    Nutch 提供了内置的高亮功能,可以通过修改或扩展其源代码来实现。例如,`HeightLighter.java` 文件可能就是用于处理高亮逻辑的类。高亮过程通常包括以下步骤: - 在查询阶段,保存用户输入的关键词。 - 在搜索...

    提高nutch运行效率的原理与方法

    在提供的文件中,"提高nutch运行效率的优化方法1.png"和"提高nutch运行效率的优化方法2.png"可能是展示具体优化步骤的图表,而"提高nutch运行效率的原理.png"则可能解释了Nutch运行的基本原理,这些图像可以帮助读者...

    nutch-1.2.part07

    nutch Nutch是一个由Java实现的,刚刚诞生开放源代码(open-source)的web搜索引擎。 尽管Web搜索是漫游Internet的基本要求, 但是现有web搜索引擎的数目却在下降。 并且这很有可能进一步演变成为一个公司垄断了几乎...

    nutch-1.2.part05

    nutch Nutch是一个由Java实现的,刚刚诞生开放源代码(open-source)的web搜索引擎。 尽管Web搜索是漫游Internet的基本要求, 但是现有web搜索引擎的数目却在下降。 并且这很有可能进一步演变成为一个公司垄断了几乎...

    nutch-1.2.part03

    nutch Nutch是一个由Java实现的,刚刚诞生开放源代码(open-source)的web搜索引擎。 尽管Web搜索是漫游Internet的基本要求, 但是现有web搜索引擎的数目却在下降。 并且这很有可能进一步演变成为一个公司垄断了几乎...

    nutch-1.2.part10

    Nutch是一个由Java实现的,刚刚诞生开放源代码(open-source)的web搜索引擎。 尽管Web搜索是漫游Internet的基本要求, 但是现有web搜索引擎的数目却在下降。 并且这很有可能进一步演变成为一个公司垄断了几乎所有的...

Global site tag (gtag.js) - Google Analytics