`

nutch 搜索site dedup

 
阅读更多

这个版本发现有个大大的bug,就是搜索时同一页面出现重复,不同页面也出现重复。即使有check dedup功能,也不起作用。

后来把代码修改一个才行,被搞晕。。。

 

 

其实关键代码就在于NutchBean.search(query)中。以下来分析一下。

 

public Hits search(Query query) throws IOException {
    if (query.getParams().getMaxHitsPerDup() <= 0)                      // disable dup checking
      return searchBean.search(query);

    final float rawHitsFactor = this.conf.getFloat("searcher.hostgrouping.rawhits.factor", 2.0f);
    int numHitsRaw = (int)(query.getParams().getNumHits() * rawHitsFactor);
    if (LOG.isInfoEnabled()) {
      LOG.info("searching for "+numHitsRaw+" raw hits");
    }
    Hits hits = searchBean.search(query);
    final long total = hits.getTotal();
    final Map<String, DupHits> dupToHits = new HashMap<String, DupHits>();
    final List<Hit> resultList = new ArrayList<Hit>();
    final Set<Hit> seen = new HashSet<Hit>();
    final List<String> excludedValues = new ArrayList<String>();
    boolean totalIsExact = true;
    int optimizeNum = 0;
    
    for (int rawHitNum = 0; rawHitNum < hits.getLength(); rawHitNum++) {
      // get the next raw hit
      if (rawHitNum == (hits.getLength() - 1) && (optimizeNum < MAX_OPTIMIZE_LOOPS)) {
        
        // increment the loop
        optimizeNum++;
        
        // optimize query by prohibiting more matches on some excluded values
        final Query optQuery = (Query)query.clone();
        for (int i = 0; i < excludedValues.size(); i++) {
          if (i == MAX_PROHIBITED_TERMS)
            break;
          optQuery.addProhibitedTerm(excludedValues.get(i),
                                     query.getParams().getDedupField());
        }
        numHitsRaw = (int)(numHitsRaw * rawHitsFactor);
        if (LOG.isInfoEnabled()) {
          LOG.info("re-searching for "+numHitsRaw+" raw hits, query: "+optQuery);
        }
        hits = searchBean.search(optQuery);
        if (LOG.isInfoEnabled()) {
          LOG.info("found "+hits.getTotal()+" raw hits");
        }
        rawHitNum = -1;
        continue;
      }

      final Hit hit = hits.getHit(rawHitNum);
      if (seen.contains(hit))
        continue;
      seen.add(hit);

      // get dup hits for its value
      final String value = hit.getDedupValue();
      DupHits dupHits = dupToHits.get(value);
      if (dupHits == null)
        dupToHits.put(value, dupHits = new DupHits());

      // does this hit exceed maxHitsPerDup?
      if (dupHits.size() == query.getParams().getMaxHitsPerDup()) {      // yes -- ignore the hit
        if (!dupHits.maxSizeExceeded) {

          // mark prior hits with moreFromDupExcluded
          for (int i = 0; i < dupHits.size(); i++) {
            dupHits.get(i).setMoreFromDupExcluded(true);
          }
          dupHits.maxSizeExceeded = true;

          excludedValues.add(value);              // exclude dup
        }
        totalIsExact = false;
      } else {                                    // no -- collect the hit
        resultList.add(hit);
        dupHits.add(hit);

        // are we done?
        // we need to find one more than asked for, so that we can tell if
        // there are more hits to be shown
        if (resultList.size() > query.getParams().getNumHits())
          break;
      }
    }

    final Hits results =
      new Hits(total,
               resultList.toArray(new Hit[resultList.size()]));
    results.setTotalIsExact(totalIsExact);
    return results;
  }

 

一。概念

hitsPerPage:相当count of a page

hitsPerSite:that is how many elements in a site per whole searches by same keyword

totalIsExact:如果没有site dup,那么就是true

numHits:就是期望的topn

seen:dedulicated set

 

二。流程

首先外部有个大循环,根据length()进行;内㠌一个loop,表明如果是有dup site便进行扩展搜索。

 

其实

numHitsRaw

没用到,可以说是多余的。当

excludedValues

为空时,这样会产生dead loop。

 

maxSizeExceeded

是为了标记一次整站搜索时同一site的是否处理过,当然前提 是达到hitspersite.

 

最后,利用

getNumHits

判断是否达到停止范围,应该说是使用8/2原则来显示下一页了。

 

 

觉得自从cutting放开lucene系列产品后,都有些不尽人意的地方。比如就这个问题。其实这版本还在其它jsp中问题等 ,可以说是测试根本不到位 呀,只是简单的替换下libs,改改人家提出的bugs就算upgrade,而最后 的测试也没把关一下,唉。。谁叫你开源呢?话又说回来,如果不开源又有多少技术不扩散,多少人失业呢?矛盾!

 

 

=============================

上传几张google中类似效果的图片;baidu现在没做了。记得以前两个都有搞similarity功能,现在只看到gg在搜索最后才显示 。

 

 


其实这里的功能相当上图中的最后一行功能。


 

 

这就是similarity 功能了,与site相当,只是在最后显示而已。


 

 

 

 

无意中发现bing的搜索有这样的結果:每页只有一个url。。。

 

 

 

 

其实这个site功能的搜索总数是不固定的,就像上图一样,每次搜索結果都不一样,所以gg也是不同的页数显示数量不一样。但在nutch中,是故意将total先保存下来,最后和reset,就显得总数保持不变,其实这样做是不对的。应该向gg学习!

 

 

 

 

  • 大小: 82.2 KB
  • 大小: 39.5 KB
  • 大小: 13.7 KB
  • 大小: 31.3 KB
  • 大小: 57.8 KB
  • 大小: 53.8 KB
分享到:
评论

相关推荐

    Nutch_的配置文件

    Nutch 是一个开源的搜索引擎项目,它主要用于网络爬虫和网页索引。在Nutch的运行过程中,配置文件起着至关重要的作用,它们定义了Nutch的行为方式和各种参数设置。Nutch的配置文件主要分为三类: 1. **Hadoop的配置...

    Nutch搜索引擎·Nutch简单应用(第3期)

    Nutch搜索引擎能够对局域网和整个Web进行爬取,且提供了一个命令行工具来控制其运行和管理。 首先,Nutch的命令是其运行和管理的核心,通过不同的命令,Nutch可以执行相应的爬取和索引操作。例如, crawl命令代表了...

    搜索引擎nutch配置

    **Nutch搜索引擎配置详解** Nutch是一款开源的网络爬虫软件,主要用于收集、索引和搜索互联网上的数据。它在大数据领域中占有重要地位,尤其对于构建自定义搜索引擎的项目非常实用。Nutch的设计理念是模块化,允许...

    Nutch搜索引擎的页面排序修改方法研究.kdh

    Nutch是一个优秀的开放源代码的Web搜索引擎。虽然Nutch的页面排序方法比较合理,但是很多情况下仍然不能 满足需要。分析开源搜索引擎Nutch代码,研究了Nutch的页面排序方法。在Nutch原有的结构基础上提出了3种修改...

    Nutch搜索引擎(1-5期)

    Nutch搜索引擎·Nutch简介及安装(第1期) Nutch搜索引擎·Solr简介及安装(第2期) Nutch搜索引擎·Nutch简单应用(第3期) Nutch搜索引擎·Eclipse开发配置(第4期) Nutch搜索引擎·Nutch浅入分析(第5期)

    Lucene+Nutch搜索引擎开发.王学松源代码

    《Lucene+Nutch搜索引擎开发:王学松源代码解析》 在信息技术日新月异的今天,搜索引擎已经成为了人们获取信息的重要工具。Lucene和Nutch是两个在开源社区广泛使用的搜索引擎技术,它们为开发者提供了构建高效、可...

    Lucene+Nutch搜索引擎开发

    在探讨“Lucene+Nutch搜索引擎开发”这一主题时,我们需要深入了解Lucene与Nutch这两个开源项目的功能、工作原理以及如何将它们结合起来构建一个高效的搜索引擎。 ### Lucene简介 Lucene是一个高性能、全功能的...

    Lucene nutch 搜索引擎 开发 实例 源码

    《Lucene与Nutch搜索引擎开发实例详解》 在信息技术领域,搜索引擎已经成为不可或缺的一部分,它们能够高效地处理海量数据,帮助用户快速找到所需信息。本文将深入探讨基于Java的开源搜索引擎框架——Lucene和Nutch...

    lucene+nutch搜索引擎开发源码1

    《lucene+nutch搜索引擎开发源码1》是一个包含开源搜索引擎项目Lucene和Nutch源代码的压缩包,主要针对搜索引擎开发的学习和实践。这个压缩包是书籍《lucene+nutch搜索引擎开发》的一部分,由于源码量较大,因此分为...

    Lucene+nutch搜索引擎开发

    完整的《Lucene+nutch搜索引擎开发》PDF版一共83.6M,无奈我上传的最高限是80M,所以切成两个。这一个是主文件,还需要下载一个副文件Lucene+nutch搜索引擎开发.z01。解压时直接放到一起,解压这个主文件就行了。

    nutch开发资料 搜索引擎

    7. **配置与定制**:Nutch的配置文件位于conf目录下,如`nutch-site.xml`和`regex-urlfilter.txt`等。开发者可以根据需求修改这些配置文件,例如设置爬虫策略、过滤规则、分词器选择等。 8. **插件系统**:Nutch...

    Nutch 1.2源码阅读

    ### Nutch 1.2 源码阅读深入解析 #### Crawl类核心作用与流程概览 在深入了解Nutch 1.2源码之前...对于希望进一步探索搜索引擎原理或开发定制化搜索引擎的应用开发者来说,Nutch提供了一个优秀的起点和丰富的资源库。

    Nutch搜索引擎·Nutch浅入分析(第5期)

    Nutch搜索引擎的基本原理和组成是互联网搜索引擎开发领域的重要知识点。Nutch搜索引擎作为一种开源的网页搜索引擎,以其模块化和可扩展性而受到开发者的青睐。以下详细解释了Nutch的基本组成和工作流程。 首先,...

    nutch使用&Nutch;入门教程

    还需要配置Nutch的`conf/nutch-site.xml`文件,指定抓取策略、存储路径、爬虫范围等参数。 四、Nutch工作流详解 Nutch的工作流程包括多个步骤,如生成段(Segments)、迭代抓取(Fetch)、解析(Parse)、更新链接...

    windows下nutch的安装.pdf

    Nutch是一个开源的Web搜索引擎框架,基于Java编写,它使用Lucene作为搜索引擎核心。Nutch能够抓取网站并建立索引,实现全文搜索功能。Cygwin是一个在Windows环境下运行的类Unix模拟环境,它提供一个庞大的类Unix工具...

    Lucene.Nutch搜索引擎开发

    学习Lucene和Nutch的入门书籍,学习搜索引擎开发值得一看的书籍

    Lucene+nutch搜索引擎开发.part1.rar

    Lucene nutch 搜索引擎开发 Part1

Global site tag (gtag.js) - Google Analytics