Nutch1.3集成Solr3.4网页快照功能实现(三)

简介:

修改Reduce方法,如下:

public void reduce(Text key, Iterator<NutchWritable> values,

            OutputCollector<Text, NutchDocument> output, Reporter reporter)

            throws IOException {

        Inlinks inlinks = null;

        CrawlDatum dbDatum = null;

        CrawlDatum fetchDatum = null;

        ParseData parseData = null;

        ParseText parseText = null;

 

        byte[] cache_content = null;

 

        while (values.hasNext()) {

            final Writable value = values.next().get(); // unwrap

            if (value instanceof Inlinks) {

                inlinks = (Inlinks) value;

            } else if (value instanceof CrawlDatum) {

                final CrawlDatum datum = (CrawlDatum) value;

                if (CrawlDatum.hasDbStatus(datum))

                    dbDatum = datum;

                else if (CrawlDatum.hasFetchStatus(datum)) {

                    // don't index unmodified (empty) pages

                    if (datum.getStatus() != CrawlDatum.STATUS_FETCH_NOTMODIFIED)

                        fetchDatum = datum;

                } else if (CrawlDatum.STATUS_LINKED == datum.getStatus()

                        || CrawlDatum.STATUS_SIGNATURE == datum.getStatus()

                        || CrawlDatum.STATUS_PARSE_META == datum.getStatus()) {

                    continue;

                } else {

                    throw new RuntimeException("Unexpected status: "

                            + datum.getStatus());

                }

            } else if (value instanceof ParseData) {

                parseData = (ParseData) value;

            } else if (value instanceof ParseText) {

                parseText = (ParseText) value;

            }

 

 else if (value instanceof Content) {

                cache_content = ((Content) value).getContent();

            }

 

else if (LOG.isWarnEnabled()) {

                LOG.warn("Unrecognized type: " + value.getClass());

            }

        }

 

        if (fetchDatum == null || dbDatum == null || parseText == null

                || parseData == null) {

            return; // only have inlinks

        }

 

        if (!parseData.getStatus().isSuccess()

                || fetchDatum.getStatus() != CrawlDatum.STATUS_FETCH_SUCCESS) {

            return;

        }

 

        NutchDocument doc = new NutchDocument();

        final Metadata metadata = parseData.getContentMeta();

 

        // add segment, used to map from merged index back to segment files

        doc.add("segment", metadata.get(Nutch.SEGMENT_NAME_KEY));

 

        // add digest, used by dedup

        doc.add("digest", metadata.get(Nutch.SIGNATURE_KEY));

 

        doc.add("cache_content", cache_content);

 

        final Parse parse = new ParseImpl(parseText, parseData);

        try {

            // extract information from dbDatum and pass it to

            // fetchDatum so that indexing filters can use it

            final Text url = (Text) dbDatum.getMetaData().get(

                    Nutch.WRITABLE_REPR_URL_KEY);

            if (url != null) {

                fetchDatum.getMetaData().put(Nutch.WRITABLE_REPR_URL_KEY, url);

            }

            // run indexing filters

            doc = this.filters.filter(doc, parse, key, fetchDatum, inlinks);

        } catch (final IndexingException e) {

            if (LOG.isWarnEnabled()) {

                LOG.warn("Error indexing " + key + ": " + e);

            }

            return;

        }

 

        // skip documents discarded by indexing filters

        if (doc == null)

            return;

 

        float boost = 1.0f;

        // run scoring filters

        try {

            boost = this.scfilters.indexerScore(key, doc, dbDatum, fetchDatum,

                    parse, inlinks, boost);

        } catch (final ScoringFilterException e) {

            if (LOG.isWarnEnabled()) {

                LOG.warn("Error calculating score " + key + ": " + e);

            }

            return;

        }

        // apply boost to all indexed fields.

        doc.setWeight(boost);

        // store boost for use by explain and dedup

        doc.add("boost", Float.toString(boost));

 

        output.collect(key, doc);

    }

至此,代码部分修改完成,接下来需要修改配置文件


本文转自william_xu 51CTO博客,原文链接:http://blog.51cto.com/williamx/722719,如需转载请自行联系原作者

相关文章
|
XML 测试技术 API
利用C#开发ONVIF客户端和集成RTSP播放功能
利用C#开发ONVIF客户端和集成RTSP播放功能
5127 123
|
测试技术 数据处理 调度
Dataphin功能Tips系列(57)「预览」vs「运行」:离线集成的神奇按钮
在数据开发过程中,使用Dataphin处理离线集成任务时,可能遇到数据过滤和字段计算组件配置正确性的验证问题。通过「预览」功能,可快速验证处理逻辑而不影响目标表;对于需要调度的任务,担心资源占用和耗时超出预期时,可使用「运行」功能进行全流程测试,评估实际耗时与资源消耗。「预览」适合逻辑验证,「运行」用于真实环境模拟,两者结合助力高效开发与调试。
455 5
|
SQL Java 关系型数据库
Dataphin功能Tips系列(53)-离线集成任务如何合理配置JVM资源
本文探讨了将MySQL数据同步至Hive时出现OOM问题的解决方案。
530 5
|
存储 NoSQL 关系型数据库
PolarDB开源数据库进阶课17 集成数据湖功能
本文介绍了如何在PolarDB数据库中接入pg_duckdb、pg_mooncake插件以支持数据湖功能, 可以读写对象存储的远程数据, 支持csv, parquet等格式, 支持delta等框架, 并显著提升OLAP性能。
1310 2
|
SQL 运维 关系型数据库
【产品升级】Dataphin V5.0版本发布:助力出海业务、增全量一体集成、异步调用API等更多功能等你发现
Dataphin是瓴羊推出的智能数据建设与治理平台,基于阿里巴巴内部实践,提供一站式数据建设与治理能力。V5.0版本研发新增支持Databricks作为离线计算引擎、支持MySQL数据库一键增全量同步、支持管理Hudi、Delta Lake表等;资产运营与消费持续提效,支持批量编辑目录名称及描述、Quick BI仪表板的上架管理等功能,增加资产可用性与盘点效率。
568 8
|
存储 JSON 前端开发
Django集成图片验证码功能:基于django-simple-captcha实现
在Web应用开发中,验证码是防止恶意攻击、自动化脚本滥用的重要手段。本文将介绍如何使用django-simple-captcha库在Django项目中快速集成图片验证码功能,包括安装配置、核心实现代码及使用方法。
340 0
|
传感器 供应链 物联网
农业单亩价值创造功能技术集成的概念与内涵
农业单亩价值创造的技术集成,通过系统性创新打破传统单一模式,融合现代科技与生态理念,提升资源效率、经济效益和生态价值。其核心在于技术协同,实现精准农业、智能装备和生物强化等多维联动,推动经济、生态和社会价值统一。同时,注重资源集约化与循环化利用,延伸产业链并升级价值链,从短期高产转向长期可持续发展。政策与制度创新支撑技术普惠,未来需因地制宜解决技术适配性和成本收益平衡问题,重塑农业评价体系,实现高质量发展。
|
存储 分布式计算 供应链
Dataphin功能Tips系列(51)-支持增全量一体实时集成
本文介绍了基于增全量一体实时集成的库存管理与分析解决方案。通过将业务中台的库存表同步至MaxCompute Delta表,实现离线与实时分析的统一支持。相比传统方案,该方法确保数据一致性,优化存储成本,降低维护复杂度,并大幅提升实时性,满足高效库存管理需求。
371 5
|
资源调度 安全 数据安全/隐私保护
Cyber Triage 3.14 发布,带来全新用户界面、Hayabusa 集成、基线设定等功能
Cyber Triage 3.14 发布,带来全新用户界面、Hayabusa 集成、基线设定等功能
312 0
Cyber Triage 3.14 发布,带来全新用户界面、Hayabusa 集成、基线设定等功能
|
监控 安全 Java
Java 开发中基于 Spring Boot 3.2 框架集成 MQTT 5.0 协议实现消息推送与订阅功能的技术方案解析
本文介绍基于Spring Boot 3.2集成MQTT 5.0的消息推送与订阅技术方案,涵盖核心技术栈选型(Spring Boot、Eclipse Paho、HiveMQ)、项目搭建与配置、消息发布与订阅服务实现,以及在智能家居控制系统中的应用实例。同时,详细探讨了安全增强(TLS/SSL)、性能优化(异步处理与背压控制)、测试监控及生产环境部署方案,为构建高可用、高性能的消息通信系统提供全面指导。附资源下载链接:[https://pan.quark.cn/s/14fcf913bae6](https://pan.quark.cn/s/14fcf913bae6)。
2866 0

热门文章

最新文章