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,如需转载请自行联系原作者

相关文章
|
11天前
|
安全 定位技术 API
婚恋交友系统匹配功能 婚恋相亲软件实现定位 语音社交app红娘系统集成高德地图SDK
在婚恋交友系统中集成高德地图,可实现用户定位、导航及基于地理位置的匹配推荐等功能。具体步骤如下: 1. **注册账号**:访问高德开放平台,注册并创建应用。 2. **获取API Key**:记录API Key以备开发使用。 3. **集成SDK**:根据开发平台下载并集成高德地图SDK。 4. **配置功能**:实现定位、导航及基于位置的匹配推荐。 5. **注意事项**:保护用户隐私,确保API Key安全,定期更新地图数据,添加错误处理机制。 6. **测试优化**:完成集成后进行全面测试,并根据反馈优化功能。 通过以上步骤,提升用户体验,提供更便捷的服务。
|
3月前
|
传感器 监控 搜索推荐
智能服装:集成健康监测功能的纺织品——未来穿戴科技的新篇章
【10月更文挑战第7天】智能服装作为穿戴科技的重要分支,正以其独特的技术优势和广泛的应用前景,成为未来科技发展的亮点之一。它不仅改变了我们对服装的传统认知,更将健康监测、运动训练、医疗康复等功能融为一体,为我们的生活带来了更多的便利和可能。随着技术的不断进步和市场的日益成熟,我们有理由相信,智能服装将成为未来穿戴科技的新篇章,引领我们走向更加健康、智能、可持续的生活方式。
|
3月前
|
前端开发 JavaScript UED
探索Python Django中的WebSocket集成:为前后端分离应用添加实时通信功能
通过在Django项目中集成Channels和WebSocket,我们能够为前后端分离的应用添加实时通信功能,实现诸如在线聊天、实时数据更新等交互式场景。这不仅增强了应用的功能性,也提升了用户体验。随着实时Web应用的日益普及,掌握Django Channels和WebSocket的集成将为开发者开启新的可能性,推动Web应用的发展迈向更高层次的实时性和交互性。
106 1
|
3天前
|
人工智能 数据处理 C#
AI Dev Gallery:微软开源 Windows AI 模型本地运行工具包和示例库,助理开发者快速集成 AI 功能
微软推出的AI Dev Gallery,为Windows开发者提供开源AI工具包和示例库,支持本地运行AI模型,提升开发效率。
37 13
|
5月前
|
资源调度 Java 调度
Spring Cloud Alibaba 集成分布式定时任务调度功能
定时任务在企业应用中至关重要,常用于异步数据处理、自动化运维等场景。在单体应用中,利用Java的`java.util.Timer`或Spring的`@Scheduled`即可轻松实现。然而,进入微服务架构后,任务可能因多节点并发执行而重复。Spring Cloud Alibaba为此发布了Scheduling模块,提供轻量级、高可用的分布式定时任务解决方案,支持防重复执行、分片运行等功能,并可通过`spring-cloud-starter-alibaba-schedulerx`快速集成。用户可选择基于阿里云SchedulerX托管服务或采用本地开源方案(如ShedLock)
151 1
|
10天前
|
人工智能 自然语言处理 搜索推荐
Open Notebook:开源 AI 笔记工具,支持多种文件格式,自动转播客和生成总结,集成搜索引擎等功能
Open Notebook 是一款开源的 AI 笔记工具,支持多格式笔记管理,并能自动将笔记转换为博客或播客,适用于学术研究、教育、企业知识管理等多个场景。
71 0
Open Notebook:开源 AI 笔记工具,支持多种文件格式,自动转播客和生成总结,集成搜索引擎等功能
|
2月前
|
缓存 资源调度 JavaScript
Vue集成Excalidraw实现在线画板功能
Excalidraw是一款开源在线绘图工具,适用于白板、思维导图、原型设计等场景。支持手绘风格、多种图形元素、导出功能及多人协作,深受开发者喜爱。本文档介绍了如何在Vue项目中集成Excalidraw,包括安装依赖、配置文件修改、页面添加等步骤,帮助开发者快速上手。
159 0
Vue集成Excalidraw实现在线画板功能
|
2月前
|
传感器 前端开发 Android开发
在 Flutter 开发中,插件开发与集成至关重要,它能扩展应用功能,满足复杂业务需求
在 Flutter 开发中,插件开发与集成至关重要,它能扩展应用功能,满足复杂业务需求。本文深入探讨了插件开发的基本概念、流程、集成方法、常见类型及开发实例,如相机插件的开发步骤,同时强调了版本兼容性、性能优化等注意事项,并展望了插件开发的未来趋势。
45 2
|
2月前
|
SQL 开发框架 .NET
突破T-SQL限制:利用CLR集成扩展RDS SQL Server的功能边界
CLR集成为SQL Server提供了强大的扩展能力,突破了T-SQL的限制,极大地拓展了SQL 的应用场景,如:复杂字符串处理、高性能计算、图像处理、机器学习集成、自定义加密解密等,使开发人员能够利用 .NET Framework的丰富功能来处理复杂的数据库任务。
|
2月前
|
JSON Java API
springboot集成ElasticSearch使用completion实现补全功能
springboot集成ElasticSearch使用completion实现补全功能
47 1

热门文章

最新文章