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

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进行索引呢?
谢谢。

相关推荐

    一个专业搜索公司关于lucene+solar资料(1)

    - 支持多种查询方式,如关键字搜索、语音搜索等。 - 能够根据用户的查询历史和偏好提供个性化搜索结果。 **1.3 你也可以做搜索引擎** - **构建搜索引擎的步骤:** - 网络爬虫:自动抓取网页内容。 - 数据处理...

    stm32+esp8266+mqtt/onenet智能家居

    stm32+esp8266+mqtt/onenet智能家居

    Android开发不用存储权限进行拍照demo源码

    Android开发不用存储权限进行拍照,得到拍照后的图片效果。有一点难度,关键是存储路径的定义。

    weathered_copper_bulb_lit.png

    j

    ComfyUI使用反向 LoRA 进行优化

    反向Lora提高画面细节。

    NM-XMS-108小秘书(凤凰电话管理系统)【纽曼声卡版小秘书】

    小秘书(凤凰电话管理系统)【纽曼声卡版小秘书】,主要用来做为来电自动录音功能。

    基于SpringBoot的疫情居家检测管理系统(源码+数据库+数据库表结构文档)514

    基于SpringBoot的疫情居家检测管理系统,系统包含三种角色:管理员、用户、医生,主要功能如下。 【用户功能】 1. 首页:获取系统信息。 2. 论坛:参与居民讨论和分享信息。 3. 公告:查看社区发布的各类公告。 4. 医保信息:了解医疗保障相关信息。 5. 个人中心:管理个人信息,查看预约和就诊历史。 【管理员功能】 1. 首页:查看系统整体。 2. 个人中心:管理管理员的个人信息。 3. 管理员管理:维护系统管理员的账户信息。 4. 医生管理:添加、编辑和删除医生信息。 5. 用户管理:查看和管理系统用户的信息。 6. 预约管理:审核和管理用户对医生的预约服务。 7. 就诊历史管理:查看和管理用户的就诊历史记录。 8. 健康信息管理:记录和查看用户的健康信息。 9. 药品管理:管理系统内的药品种类。 10. 药品入库管理:记录和管理药品的入库情况。 11. 药品使用管理:记录和管理药品的使用情况。 12. 医保信息管理:管理医保相关信息。 13. 论坛管理:审核和回复用户在论坛上的帖子。 14. 公告管理:发布、编辑和管理公告信息。 15. 基础数据管理:管理系统的基础数据。 16. 轮播图信息:管理系统首页的轮播图展示。 【医生功能】 1. 首页:查看医生个人信息。 2. 个人中心:管理医生的个人信息。 3. 预约管理:查看和管理用户对医生的预约服务。 4. 就诊历史管理:查看和管理用户的就诊历史记录。 5. 健康信息管理:记录和查看用户的健康信息。 6. 药品管理:管理系统内的药品种类。 7. 药品入库管理:记录和管理药品的入库情况。 8. 药品使用管理:记录和管理药品的使用情况。 9. 医保信息管理:管理医保相关信息。 10. 论坛管理:审核和回复用户在论坛上的帖子。 11. 公告管理:发布、编辑和管理公告信息。 12. 轮播图信息:管理系统首页的轮播

    基于python的Opencv项目实战.zip

    基于python的Opencv项目实战.zip

    鸿蒙开发画廊效果demo源码

    鸿蒙开发画廊效果功能,中间大,两边小的浏览效果,难度不小,进行了一定的封装。很好看的画廊效果

    win32汇编环境,网络编程入门之十九

    win32汇编环境,网络编程入门之十九

    Linux文件管理类命令详解.zip

    linux

    【HD-RK3576-PI】定制用户升级固件

    【HD-RK3576-PI】定制用户升级固件

    机器学习大规模L1正则化线性分类优化方法与软件性能对比分析:详解GLMNET算法及实验结果

    内容概要:本文是关于大规模L1正则化线性分类优化方法和软件比较的补充材料,由台湾大学计算机科学系的研究团队撰写。文章详细介绍了GLMNET算法的核心公式推导及其具体实现步骤,包括如何计算L¯j(0; X˜),以及如何维护关键变量以减少计算量。此外,文中对比了多种求解器(如CDN、IPM、TRON等)在不同数据集上的性能,涵盖达到特定停止准则所需时间、迭代次数及每次迭代的平均成本。研究结果显示,在大多数数据集上,CDN方法表现最优,但在极严格的条件下,IPM方法表现更好。对于L1和L2正则化的逻辑回归,文中指出L1正则化在某些数据类型上可能提供更好的准确性,但训练时间较长,因此推荐先尝试L2正则化用于分类任务,而L1正则化更适合特征选择。 适合人群:对机器学习算法尤其是正则化技术有一定了解的数据科学家和研究人员。 使用场景及目标:①需要进行大规模线性分类问题的优化;②比较不同优化方法和工具包在实际应用中的效果;③理解L1和L2正则化在逻辑回归中的区别及其适用情况。 其他说明:本文提供了详细的数学推导和实验结果分析,有助于深入理解各种优化方法的工作原理及其优劣。读者可以通过这些内容选择最适合自身需求的算法和工具包。

    西电A测或通院微控温度仿真控制系统的proteus文件

    西电A测或通院微控温度仿真控制系统的proteus文件

    华为ONT使能2.0工具

    华为ONT使能2.0工具

    basalt_top.png

    basalt_top

    无极调速数控车床主轴箱装配CAD图.rar

    无极调速数控车床主轴箱装配CAD图.rar

    乳液涂料生产流程图.rar

    乳液涂料生产流程图.rar

    Day08 【基于jieba分词在词潜入编码的文本多分类】

    训练集数据

    674322 Docker基础与实战.pdf

    674322 Docker基础与实战.pdf

Global site tag (gtag.js) - Google Analytics