热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

nutch和solr建立搜索引擎基础(单机版)

Nutch[1]是一个开源Java实现的搜索引擎,它提供了我们运行自己的搜索引擎所需的全部工具,包括全文搜索和Web爬虫。Solr[2]是一个基于Lucene的全文搜索服务器,它对

Nutch[1] 是一个开源Java实现的搜索引擎,它提供了我们运行自己的搜索引擎所需的全部工具,包括全文搜索和Web爬虫。
Solr[2]是一个基于Lucene的全文搜索服务器,它对外提供类似于Web-service的API查询接口,是一款非常优秀的全文搜索引擎。

为什么要整合nutch和solr?

简单地讲,nutch重在提供数据源采集(Web爬虫)能力,轻全文搜索(lucene)能力;solr是lucene的扩展,亦是nutch的全文搜索的扩展。重在将nutch的爬取结果,通过其对外提供检索服务。

一、版本选择

1. nutch-1.13

支持hadoop,可以通过hadoop,获得分布式爬虫的能力。本文重点介绍nutch的原力,关于分布式爬虫,将在后续章节中介绍。另外,nutch-2.x系列支持hbase,可以根据自身的需要灵活选择。需要说明的是两版的用法是不同的,nutch-2.x要更为复杂。在使用nutch-2.x之前,最好具备nutch-1.x的基础。

2. Solr-6.6.0

截止发稿时是最新版本,可参考官网的解释,这里没什么要说的。

二、安装环境准备

1. 系统环境

Ubuntu14.04x64 或 Centos6.5x64, 应用程序采用二进制安装,不要求编译环境

2. java环境

vim /etc/profile
# set for java
export JAVA_HOME=/opt/jdk1.8.0_111  #二进制包已经解压安装到该路径
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib
export _JAVA_OPTIOnS="­Xmx2048m ­XX:MaxPermSize=512m ­Djava.awt.headless=true"

注:java的安装方法选择二进制包即可,本文不再赘述

3. nutch+solr环境

vim /etc/profile
export NUTCH_RUNTIME_HOME='/opt/apache-nutch-1.13'
export PATH=$NUTCH_RUNTIME_HOME/bin:$PATH
export APACHE_SOLR_HOME='/opt/solr-6.6.0'    #单引号不能少
export PATH=$APACHE_SOLR_HOME/bin:$PATH
export CLASSPATH=.:$CLASSPATH:$APACHE_SOLR_HOME/server/lib

source /etc/profile #加载到环境

三、solr的安装与配置

solr的安装(二进制包)

wget http://mirror.bit.edu.cn/apache/lucene/solr/6.6.0/solr-6.6.0.tgz
cat solr-6.6.0.tgz |(cd /opt; tar xzfp -)
solr status  #注:如果执行结果不正常,执行`source /etc/profile`和检查该文件的内容
No Solr nodes are running.
#启动solr服务
solr start -force   #-force:强制以root身份执行,生产环境请勿使用该参数
#停止solr服务
solr stop

安装完毕。

solr的配置

cd ${APACHE_SOLR_HOME}
cp -r server/solr/configsets/basic_configs server/solr/configsets/nutch
cp ${NUTCH_RUNTIME_HOME}/conf/schema.xml server/solr/configsets/nutch/conf
mv server/solr/configsets/nutch/conf/managed-schema server/solr/configsets/nutch/conf/managed-schema.backup
#启动solr服务
solr start
#创建nutch core
solr create -c nutch -d server/solr/configsets/nutch/conf/ -force #-force:强制以root身份执行,生产环境请勿使用该参数

创建过程并非一帆风顺,整个过程充满了各种bug,从这个角度考虑,生产环境中有必要更换到solr的稳定版,好在这些坑已经趟过:

问题1:Caused by: Unknown parameters: {enablePositionInc rements=true}
具体信息:
Copying configuration to new core instance directory:
/opt/solr-6.6.0/server/solr/nutch
Creating new core 'nutch' using command:
http://localhost:8983/solr/admin/cores?action=CREATE&name=nutch&instanceDir=nutch
ERROR: Error CREATEing SolrCore 'nutch': Unable to create core [nutch] Caused by: Unknown parameters: {enablePositiOnIncrements=true}
解决办法:
vim  server/solr/configsets/nutch/conf/schema.xml 找到并去掉enablePositiOnIncrements=true

问题2:ERROR: Error CREATEing SolrCore 'nutch': Unable to create core [nutch] Caused by: defaultSearchField has been deprecated and is incompatible with configs with luceneMatchVersion >= 6.6.0.  Use 'df' on requests instead.
解决办法:
vim server/solr/configsets/nutch/conf/solrconfig.xml 将luceneMatchVersion版本修改为6.2.0

问题3:org.apache.solr.common.SolrException: fieldType 'booleans' not found in the schema
解决办法:
vim /opt/solr-6.6.0/server/solr/configsets/nutch/conf/solrconfig.xml
找到booleans,替换成boolean,如下:

    java.lang.Boolean
    boolean

Then it will work..

问题3以后,会发生多起类似事件,如下:
ERROR: Error CREATEing SolrCore 'nutch': Unable to create core [nutch] Caused by: fieldType 'tdates' not found in the schema
ERROR: Error CREATEing SolrCore 'nutch': Unable to create core [nutch] Caused by: fieldType 'tlongs' not found in the schema
ERROR: Error CREATEing SolrCore 'nutch': Unable to create core [nutch] Caused by: fieldType 'tdoubles' not f ound in the schema
参照问题3的方法,一次性去掉''中关键字的复数形式即可。

问题4:ERROR:
Core 'nutch' already exists!
Checked core existence using Core API command:
http://localhost:8983/solr/admin/cores?action=STATUS&core=nutch
解决办法:
solr delete -c nutch       #删除core 'nutch'
如果删除完,还提示这个错误,这是由于每次修改完配置文件,需要重启下solr服务,更新下状态。

最终的执行结果:
solr create -c nutch -d server/solr/configsets/nutch/conf/ -force
Copying configuration to new core instance directory:
/opt/solr-6.6.0/server/solr/nutch

Creating new core 'nutch' using command:
http://localhost:8983/solr/admin/cores?action=CREATE&name=nutch&instanceDir=nutch

{
  "responseHeader":{
    "status":0,
    "QTime":3408},
  "core":"nutch"}
执行成功!

在浏览器中访问
http://localhost:8983/solr/#/
可以看到名称为nutch的core

solr的安全设置

1. realm.properties

cd /opt/solr-6.6.0/server
cat etc/realm.properties
#
# 这个文件定义用户名,密码和角色
#
# 格式如下
#  : [, ...]
#
#userName: password,role
yourname: yourpass,admin

2. solr-jetty-context.xml

cat contexts/solr-jetty-context.xml



  
  /solr-webapp/webapp
  /etc/webdefault.xml
  false
  
    
        
            Solr Admin Access
            /etc/realm.properties
        
    
  

3. WEB-INF/web.xml

vim solr-webapp/webapp/WEB-INF/web.xml
  
  
    ...
  

  
    
        Solr auth enticated application  
        /  
      
       
          admin  
       
   
   
          BASIC  
          Solr Admin Access
  



重启solr服务
solr stop && solr start -force

在浏览器中访问solr
http://localhost:8983/solr/nutch/
可以看到要求登录的界面

四、nutch的安装与配置

nutch的安装(二进制包)

wget http://mirrors.hust.edu.cn/apache/nutch/1.13/apache-nutch-1.13-bin.tar.gz
cat apache-nutch-1.13-bin.tar.gz |(cd /opt; tar xzfp -)
nutch -help   #注:如果执行结果不正常,执行`source /etc/profile`和检查该文件的内容

安装完毕。

nutch的配置

以爬取http://nutch.apache.org站点为例,配置如下:

1. 配置nutch-site.xml

vim $NUTCH_RUNTIME_HOME/conf/nutch-site.xml

 http.agent.name
 My Nutch Spider

#配置indexer-solr插件
#我的方法是替换indexer-elastic为indexer-solr插件
sed -i 's/indexer-elastic/indexer-solr/g' $NUTCH_RUNTIME_HOME/conf/nutch-site.xml
#注意:官方文档不是像我这样做的,请按照我的方法配置,或者注释掉indexer-elastic,否则会深受其害,踩坑过程后面会说

2. 建立URL列表

#为方便修改配置文件,选择conf文件夹作为数据的存储路径
cd $NUTCH_RUNTIME_HOME/conf
mkdir -p urls       #存储要爬取的URLS列表,每行只写一个url,可以多行
cd urls
echo 'http://nutch.apache.org/' > seed.txt  #地址可以是静态的链接,也可以是动态的链接

3. 设置url的正则匹配规则

vim regex-urlfilter.txt
将光标移到文件末尾,将下列内容:
# accept anything else
+.
替换为:
# accept anything else
 +^http://([a-z0-9]*\.)*nutch.apache.org/ #这将包含带有域名前缀的url,比如,http://3w.nutch.apache.org

4. 允许抓取动态内容

vim crawl-urlfilter.txt regex-urlfilter.txt

替换:
  # skip URLs containing certain characters as probable queries, etc.
  -[?*!@=]
为:
  # accept URLs containing certain characters as probable queries, etc.
  +[?=&]

注: conf下有各种配置文件,涉及各种爬取规则和正则过滤器。将在后续的文章中详细说明

五、爬取和检索的过程

1. nutch爬取程序的概念组成

抓取程序自动在用户指定目录下面建立爬取目录,其目录下可以看到crawldb,segments,linkdb子目录

1. crawldb(爬虫数据库)

crawldb目录下面存放下载的URL,以及下载的日期、过期时间

2. linkdb-链接数据库

linkdb目录存放URL的关联关系,是下载完成后分析时创建的,通过这个关联关系可以实现类似google的pagerank功能

3. segments-一组分片

segments目录存储抓取的页面,这些页面是根据层级关系分片的。既segments下面子目录的个数与获取页面的层数有关系,如果指定“-depth”参数是10层,这个目录下就有10层,结构清晰并防止文件过大。
segments目录里面有6个子目录,分别是:

“crawl_generate” 生成要获取的一组URL的名字,既生成待下载的URL的集合
“crawl_fetch” 包含获取每个UR L的状态
”content“ 包含从每个URL检索的原始内容
“parse_text” 包含每个URL的解析文本(存放每个解析过的URL的文本内容)
“parse_data” 包含从每个URL分析的外部链接和元数据
“crawl_parse” 包含用于更新crawldb的outlink URL(外部链接库)

2. nutch的爬取流程说明

爬取过程包括

injector -> generator -> fetcher -> parseSegment -> updateCrawleDB -> Invert links -> Index -> DeleteDuplicates -> IndexMerger

1. 根据之前建好的URL列表文件,将URL集注入crawldb数据库---inject
2. 根据crawldb数据库创建抓取列表---generate
3. 执行抓取,获取网页信息---fetch
4. 执行解析,解析网页信息---parse
5. 更新数据库,把获取到的页面信息存入数据库中---updatedb
6. 重复进行2~4的步骤,直到预先设定的抓取深度。---这个循环过程被称为“产生/抓取/更新”循环
7. 根据sengments的内容更新linkdb数据库---invertlinks
8. 建立索引---index

3. solr查询流程包括

  1. 用户通过用户接口进行查询操作
  2. 将用户查询转化为solr查询
  3. 从索引库中提取满足用户检索需求的结果集

六、爬取和检索的实例

1. Inject

nutch inject crawl/crawldb urls

2. Generate

nutch generate crawl/crawldb crawl/segments

3. Fetching

s1=`ls -d crawl/segments/2* | tail -1`
echo $s1
nutch fetch $s1

4. Parse

nutch parse $s1

5. updatedb

nutch updatedb crawl/crawldb $s1

6. 循环抓取

重复2-4的过程,抓取下一层页面
演示过程中,为了节约时间,我们约定一个参数,只抓取前 top 1000 的页面

nutch generate crawl/crawldb crawl/segments -topN 1000
s2=`ls -d crawl/segments/2* | tail -1`
echo $s2
nutch fetch $s2
nutch parse $s2

updatedb:
nutch updatedb crawl/crawldb $s2

重复2-4的过程,抓取下下层的页面
同样只取前1000个页面进行抓取

nutch generate crawl/crawldb crawl/segments -topN 1000
s3=`ls -d crawl/segments/2* | tail -1`
echo $s3
nutch fetch $s3
nutch parse $s3

updatedb:
nutch updatedb crawl/crawldb $s3

这样我们总共抓取了三个层级深度的页面

ls crawl/segments/
20170816191100  20170816191415  20170816192100

7. Invertlinks

nutch invertlinks crawl/linkdb -dir crawl/segments

8. Indexing into Apache Solr(推送solr index)

nutch index -Dsolr.server.url=http://用户名:密码@localhost:8983/solr/nutch crawl/crawldb/ -linkdb crawl/linkdb/ crawl/segments/20170816191100/ -filter -normalize -deleteGone
#这里的“用户名:密码”是solr的jetty下的
值得一提的是,如果按照官方标准语法,上面命令会变为:
nutch index -Dsolr.auth.username="yourname" -Dsolr.auth.password="yourpassword" -Dsolr.server.url=http://localhost:8983/solr/nutch crawl/crawldb/ -linkdb crawl/linkdb/ crawl/segments/20170816191100/ -filter -normalize -deleteGone
这里会提示语法错误,在官网和google上还没有更好的解决办法。我已经把上面的方法更新到
http://lucene.472066.n3.nabble.com/Nutch-authentication-problem-to-solr-td4251336.html#a4351038
可能其它版本没有这个问题。
最终的推送结果如下:
nutch index -Dsolr.server.url=http://xxx:xxx@localhost:8983/solr/nutch crawl/crawldb/ -linkdb crawl/linkdb/ crawl/segments/20170816191100/ -filter -normalize -deleteGone
Segment dir is co mplete: crawl/segments/20170816191100.
Indexer: starting at 2017-08-17 18:22:26
Indexer: deleting gone documents: true
Indexer: URL filtering: true
Indexer: URL normalizing: true
Active IndexWriters :
SOLRIndexWriter
	solr.server.url : URL of the SOLR instance
	solr.zookeeper.hosts : URL of the Zookeeper quorum
	solr.commit.size : buffer size when sending to SOLR (default 1000)
	solr.mapping.file : name of the mapping file for fields (default solrindex-mapping.xml)
	solr.auth : use authentication (default false)
	solr.auth.username : username for authentication
	solr.auth.password : password for authentication


Indexing 1/1 documents
Deleting 0 documents
Indexer: number of documents indexed, deleted, or skipped:
Indexer:      1  indexed (add/update)
Indexer: finished at 2017-08-17 18:22:32, elapsed: 00:00:05

9. 在solr上查询

在浏览器中访问solr
http://localhost:8983/solr/
nutch和solr建立搜索引擎基础(单机版)
nutch和solr建立搜索引擎基础(单机版)

10. 通过脚本自动完成1-9

crawl -i -D solr.server.url=http://用户名:密码@localhost:8983/solr/ urls/ crawl/ 2

参考

https://wiki.apache.org/nutch/NutchTutorial#Install_Nutch
[1]https://wiki.apache.org/nutch/
[2]https://wiki.apache.org/solr/


推荐阅读
  • 在开发过程中,我最初也依赖于功能全面但操作繁琐的集成开发环境(IDE),如Borland Delphi 和 Microsoft Visual Studio。然而,随着对高效开发的追求,我逐渐转向了更加轻量级和灵活的工具组合。通过 CLIfe,我构建了一个高度定制化的开发环境,不仅提高了代码编写效率,还简化了项目管理流程。这一配置结合了多种强大的命令行工具和插件,使我在日常开发中能够更加得心应手。 ... [详细]
  • 本文介绍了 Go 语言中的高性能、可扩展、轻量级 Web 框架 Echo。Echo 框架简单易用,仅需几行代码即可启动一个高性能 HTTP 服务。 ... [详细]
  • 本文详细介绍如何使用Netzob工具逆向未知通信协议,涵盖从基本安装到高级模糊测试的全过程。通过实例演示,帮助读者掌握Netzob的核心功能。 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 高端存储技术演进与趋势
    本文探讨了高端存储技术的发展趋势,包括松耦合架构、虚拟化、高性能、高安全性和智能化等方面。同时,分析了全闪存阵列和中端存储集群对高端存储市场的冲击,以及高端存储在不同应用场景中的发展趋势。 ... [详细]
  • 本文详细介绍了如何在 Linux 系统上安装 JDK 1.8、MySQL 和 Redis,并提供了相应的环境配置和验证步骤。 ... [详细]
  • 本文详细介绍了如何使用OpenSSL自建CA证书的步骤,包括准备工作、生成CA证书、生成服务器待签证书以及证书签名等过程。 ... [详细]
  • 帝国CMS中的信息归档功能详解及其重要性
    本文详细解析了帝国CMS中的信息归档功能,并探讨了其在内容管理中的重要性。通过归档功能,用户可以有效地管理和组织大量内容,提高网站的运行效率和用户体验。此外,文章还介绍了如何利用该功能进行数据备份和恢复,确保网站数据的安全性和完整性。 ... [详细]
  • Swoole加密机制的安全性分析与破解可能性探讨
    本文深入分析了Swoole框架的加密机制,探讨了其在实际应用中的安全性,并评估了潜在的破解可能性。研究结果表明,尽管Swoole的加密算法在大多数情况下能够提供有效的安全保护,但在特定场景下仍存在被攻击的风险。文章还提出了一些改进措施,以增强系统的整体安全性。 ... [详细]
  • Amoeba 通过优化 MySQL 的读写分离功能显著提升了数据库性能。作为一款基于 MySQL 协议的代理工具,Amoeba 能够高效地处理应用程序的请求,并根据预设的规则将 SQL 请求智能地分配到不同的数据库实例,从而实现负载均衡和高可用性。该方案不仅提高了系统的并发处理能力,还有效减少了主数据库的负担,确保了数据的一致性和可靠性。 ... [详细]
  • 在JavaWeb项目架构中,NFS(网络文件系统)的实现与优化是关键环节。NFS允许不同主机系统通过局域网共享文件和目录,提高资源利用率和数据访问效率。本文详细探讨了NFS在JavaWeb项目中的应用,包括配置、性能优化及常见问题的解决方案,旨在为开发者提供实用的技术参考。 ... [详细]
  • NoSQL数据库,即非关系型数据库,有时也被称作Not Only SQL,是一种区别于传统关系型数据库的管理系统。这类数据库设计用于处理大规模、高并发的数据存储与查询需求,特别适用于需要快速读写大量非结构化或半结构化数据的应用场景。NoSQL数据库通过牺牲部分一致性来换取更高的可扩展性和性能,支持分布式部署,能够有效应对互联网时代的海量数据挑战。 ... [详细]
  • PHP 使用 Cookie 进行访问授权的方法
    本文介绍了如何使用 PHP 和 Cookie 实现访问授权,包括表单验证、数据库查询和会话管理等关键步骤。 ... [详细]
  • 本文详细介绍了如何解决DNS服务器配置转发无法解析的问题,包括编辑主配置文件和重启域名服务的具体步骤。 ... [详细]
  • 触发器的稳态数量分析及其应用价值
    本文对数据库中的SQL触发器进行了稳态数量的详细分析,探讨了其在实际应用中的重要价值。通过研究触发器在不同场景下的表现,揭示了其在数据完整性和业务逻辑自动化方面的关键作用。此外,还介绍了如何在Ubuntu 22.04环境下配置和使用触发器,以及在Tomcat和SQLite等平台上的具体实现方法。 ... [详细]
author-avatar
龙叔君_541
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有