- 浏览: 283010 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (247)
- free talking (11)
- java (18)
- search (16)
- hbase (34)
- open-sources (0)
- architect (1)
- zookeeper (16)
- vm (1)
- hadoop (34)
- nutch (33)
- lucene (5)
- ubuntu/shell (8)
- ant (0)
- mapreduce (5)
- hdfs (2)
- hadoop sources reading (13)
- AI (0)
- distributed tech (1)
- others (1)
- maths (6)
- english (1)
- art & entertainment (1)
- nosql (1)
- algorithms (8)
- hadoop-2.5 (16)
- hbase-0.94.2 source (28)
- zookeeper-3.4.3 source reading (1)
- solr (1)
- TODO (3)
- JVM optimization (1)
- architecture (0)
- hbase-guideline (1)
- data mining (3)
- hive (1)
- mahout (0)
- spark (28)
- scala (3)
- python (0)
- machine learning (1)
最新评论
-
jpsb:
...
为什么需要分布式? -
leibnitz:
hi guy, this is used as develo ...
compile hadoop-2.5.x on OS X(macbook) -
string2020:
撸主真土豪,在苹果里面玩大数据.
compile hadoop-2.5.x on OS X(macbook) -
youngliu_liu:
怎样运行这个脚本啊??大牛,我刚进入搜索引擎行业,希望你能不吝 ...
nutch 数据增量更新 -
leibnitz:
also, there is a similar bug ...
2。hbase CRUD--Lease in hbase
这个版本发现有个大大的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学习!
发表评论
-
nutch 几种搜索布署
2011-12-29 13:21 8691。这是最简单的一种布署方式,通常用于简单测试。 ... -
nutch搜索架构关键类
2011-12-13 00:19 14todo -
nutch结合hadoop解説 RPC机制
2011-12-13 00:18 893todo -
nutch搜索架构关键类
2011-12-13 00:17 1135在整个crawl->recrawl ... -
访问hadoop数据时注意相对路径问题
2011-12-07 00:30 1421今天在nutch配置分布式搜索时出现搜索不到結果,背景是: ... -
nutch 发布时要注意的问题
2011-12-04 23:40 1857在利用Nutch自身的ant打 ... -
nutch 中的trie tree 算法简介
2011-11-18 14:18 937todoo -
nutch 配置文件详解
2011-11-17 16:58 2165下面来分析 一下,conf目录下各文件的作用是怎样的: cr ... -
nutch 分布式索引(爬虫)
2011-10-19 00:15 3845其实,全网抓取比intranet区别再于, 前者提供了较 ... -
nutch 分布式搜索-cluster-hdfs index
2011-10-17 02:14 1366此过程也很简单,步骤是: a.put the indexes ... -
nutch 分布式搜索-cluster-local index
2011-10-17 02:13 780此过程亦相当简单,只是修改一下search-servers.t ... -
nutch 分布式搜索-standalone mode
2011-10-17 01:47 967本地模式篇,其实就是相当 于之前图中的虚线部分。詳細如下 ... -
nutch对某个contentType文档进行解析的流程--html
2011-09-22 23:44 990经过上一遍contentType流程 介绍后,现在进入具体的 ... -
nutch对某个contentType文档进行解析的流程
2011-09-04 12:48 1670nutch支持对诸多的文档 ... -
nutch 处理robots.txt原理
2011-08-28 16:42 1709形如大多SE一样,在bot ... -
nutch analyzers 使用机制
2011-07-31 14:35 821一。索引时analyzer 我们知道,在Indexer ... -
nutch 数据增量更新
2011-07-22 19:25 3028以下是转载的执行recrawl的脚本(其实还是可以再优化的,比 ... -
nutch 评分机制
2011-07-22 02:28 1751其实nutch的评分机制有二部分,与通常的SE类似: 1 ... -
nutch 搜索流程 2-distributed search
2011-07-20 13:55 995了解了local search ,那么进行distribute ... -
nutch 搜索流程 1-local search
2011-07-19 23:34 1092nutch搜索时进行了querys ...
相关推荐
Nutch 是一个开源的搜索引擎项目,它主要用于网络爬虫和网页索引。在Nutch的运行过程中,配置文件起着至关重要的作用,它们定义了Nutch的行为方式和各种参数设置。Nutch的配置文件主要分为三类: 1. **Hadoop的配置...
Nutch搜索引擎能够对局域网和整个Web进行爬取,且提供了一个命令行工具来控制其运行和管理。 首先,Nutch的命令是其运行和管理的核心,通过不同的命令,Nutch可以执行相应的爬取和索引操作。例如, crawl命令代表了...
**Nutch搜索引擎配置详解** Nutch是一款开源的网络爬虫软件,主要用于收集、索引和搜索互联网上的数据。它在大数据领域中占有重要地位,尤其对于构建自定义搜索引擎的项目非常实用。Nutch的设计理念是模块化,允许...
Nutch是一个优秀的开放源代码的Web搜索引擎。虽然Nutch的页面排序方法比较合理,但是很多情况下仍然不能 满足需要。分析开源搜索引擎Nutch代码,研究了Nutch的页面排序方法。在Nutch原有的结构基础上提出了3种修改...
Nutch搜索引擎·Nutch简介及安装(第1期) Nutch搜索引擎·Solr简介及安装(第2期) Nutch搜索引擎·Nutch简单应用(第3期) Nutch搜索引擎·Eclipse开发配置(第4期) Nutch搜索引擎·Nutch浅入分析(第5期)
《Lucene+Nutch搜索引擎开发:王学松源代码解析》 在信息技术日新月异的今天,搜索引擎已经成为了人们获取信息的重要工具。Lucene和Nutch是两个在开源社区广泛使用的搜索引擎技术,它们为开发者提供了构建高效、可...
Apache Nutch 是一个开源的网络爬虫框架,用于抓取互联网上的网页并进行索引,为搜索引擎提供数据基础。Nutch 1.7 版本是其稳定的一个分支,适用于学习和实际项目应用。本文将详细介绍在Windows和Linux环境下如何...
在探讨“Lucene+Nutch搜索引擎开发”这一主题时,我们需要深入了解Lucene与Nutch这两个开源项目的功能、工作原理以及如何将它们结合起来构建一个高效的搜索引擎。 ### Lucene简介 Lucene是一个高性能、全功能的...
《Lucene与Nutch搜索引擎开发实例详解》 在信息技术领域,搜索引擎已经成为不可或缺的一部分,它们能够高效地处理海量数据,帮助用户快速找到所需信息。本文将深入探讨基于Java的开源搜索引擎框架——Lucene和Nutch...
《lucene+nutch搜索引擎开发源码1》是一个包含开源搜索引擎项目Lucene和Nutch源代码的压缩包,主要针对搜索引擎开发的学习和实践。这个压缩包是书籍《lucene+nutch搜索引擎开发》的一部分,由于源码量较大,因此分为...
完整的《Lucene+nutch搜索引擎开发》PDF版一共83.6M,无奈我上传的最高限是80M,所以切成两个。这一个是主文件,还需要下载一个副文件Lucene+nutch搜索引擎开发.z01。解压时直接放到一起,解压这个主文件就行了。
7. **配置与定制**:Nutch的配置文件位于conf目录下,如`nutch-site.xml`和`regex-urlfilter.txt`等。开发者可以根据需求修改这些配置文件,例如设置爬虫策略、过滤规则、分词器选择等。 8. **插件系统**:Nutch...
### Nutch 1.2 源码阅读深入解析 #### Crawl类核心作用与流程概览 在深入了解Nutch 1.2源码之前...对于希望进一步探索搜索引擎原理或开发定制化搜索引擎的应用开发者来说,Nutch提供了一个优秀的起点和丰富的资源库。
Nutch搜索引擎的基本原理和组成是互联网搜索引擎开发领域的重要知识点。Nutch搜索引擎作为一种开源的网页搜索引擎,以其模块化和可扩展性而受到开发者的青睐。以下详细解释了Nutch的基本组成和工作流程。 首先,...
还需要配置Nutch的`conf/nutch-site.xml`文件,指定抓取策略、存储路径、爬虫范围等参数。 四、Nutch工作流详解 Nutch的工作流程包括多个步骤,如生成段(Segments)、迭代抓取(Fetch)、解析(Parse)、更新链接...
Nutch是一个开源的Web搜索引擎框架,基于Java编写,它使用Lucene作为搜索引擎核心。Nutch能够抓取网站并建立索引,实现全文搜索功能。Cygwin是一个在Windows环境下运行的类Unix模拟环境,它提供一个庞大的类Unix工具...
学习Lucene和Nutch的入门书籍,学习搜索引擎开发值得一看的书籍
Lucene nutch 搜索引擎开发 Part1