企业搜索引擎实战开发(我们老师上课讲到的)
第一章:搜素引擎介绍
1.1、搜索引擎的应用领域
搜索引擎是一个新兴的领域,相同类型的数据很少,比如几百条,甚至几万条,并不需要搜索。只要有一个很清晰的导引,把这些内容涵盖住,用户能够不花很大成本找到,这样的状态不需要垂直类型的搜索。但是当数据量已经庞大到10万量级,垂直搜索的机会就出来了。
目前垂直搜索技术,大量应用于互联网的门户网站中,例如:商品检索、关键字查询、团购等网站。未来垂直搜索的机会在哪里?如果不用搜索引擎,仅仅靠数据库的全文检索功能是无法满足我们的需求的,假设用户搜索10次需要花费5分钟,那么使用垂直搜索的话,仅仅需要可能是1分钟。
目前从企业的使用角度考虑,主要是Apache提供的开源的搜索引擎技术使用的范围比较广泛,例如:Lucene、Nutch(网络爬虫)、Solr(集成的企业搜索引擎平台)、ElasticSearch(基于Lucene的分布式RESTFul风格)等主流平台。
第二章:Lucene实战开发
2.1、Lucene技术背景介绍
Lucene最初是由Doug Cutting开发的,在SourceForge的网站上提供下载。
Apache Lucene工程是一个开源的全文检索引擎工具包,适合做企业站内全文检索,在Java开发环境中Lucene是一个成熟的免费的开源工具,也是我们做J2EE开发中的一个核心知识点,其中包括以下内容:
~java
1. Lucene Core 核心代码。提供了一个基于Java基础的索引和检索技能,例如拼写检查、高亮显示、高级分词器的能力。
2. Solr采用Lucene搜索库为核心,提供了XML、HTTP、JSON、Python和Ruby等接口以及搜索、缓存和web admin的使用接口。
3. 目前PyLucene也作为Python的一部分核心代码。
4. Lucene 核心版本可以从以下网址下载 http://mirror.bit.edu.cn/apache/lucene/solr/ 目前最高版本为6.6
~
2.2、Lucene核心技术特征
(1)索引文件格式独立于应用平台。Lucene定义了一套以8位字节为基础的索引文件格式,使得兼容系统或者不同平台的应用能够共享建立的索引文件。
(2)在传统全文检索引擎的倒排索引的基础上,实现了分块索引,能够针对新的文件建立小文件索引,提升索引速度。然后通过与原有索引的合并,达到优化的目的。
(3)优秀的面向对象的系统架构,使得对于Lucene扩展的学习难度降低,方便扩充新功能。
(4)设计了独立于语言和文件格式的文本分析接口,索引器通过接受Token流完成索引文件的创立,用户扩展新的语言和文件格式,只需要实现文本分析的接口。
(5)已经默认实现了一套强大的查询引擎,用户无需自己编写代码即可使系统可获得强大的查询能力,Lucene的查询实现中默认实现了布尔操作、模糊查询(Fuzzy Search[11])、分组查询等等。
2.3、使用Maven构建Lucene开发工程
搭建Lucene的基本开发环境我们可以在使用Eclipse或者IntelliJ IDEA 这里使用的是后者
pom.xml配置如下:
~~~xml
2.3、Lucene工作流程图
Lucene不是一个完整的搜索引擎框架,只是提供了一套API,我们可以往索引库中创建所有,并且进行快速查询,对于在企业中某一些数据频繁的做大量查询工作的时候,可以考虑使用Lucene来处理,下图演示了Lucene的工作流程:
2.4、Lucene创建索引的步骤
Create Index
Lucene提供了一套API帮助我们对内容(数据、网页)建立索引,一般都是由程序员来完成可以手工或者通过网络爬虫抓取数据,这个过程是很耗时的,一般都是在深夜进行,也就是网站访问量最少的时候进行的。Build Document
Lucene只能对纯文本的内容建立索引,所以在图片、影音方面可能实现不了检索的功能,但是针对PDF、Word、Excel等文档必须要提取内容之后才能建立索引。
Build Document的过程实际上就是提取出建立索引所需的文本内容。
Document是Lucene的基本单位,也就是说Document可以有很多关键字段,每一个字段都是name和value的关系。Analyze分词检索
Lucene提供标准分词器、庖丁解牛分词器、Solr核心词库。
2.5、Lucene 创建Index核心类库
IndexWriter 创建索引和文档的类包括删除索引、删除文档。
Directory 目录管理create or append
Analyzer 分词器有英文、德文、中文等。
Document 内容文档
Field 关键字段
创建索引过程:
2.6、Lucene 索引检索Searcher类
IndexSearcher 检索文档
Term Lucene基本的搜索单元
Query 是一个抽象类,表示查询,有很多子类
1、BooleanQuery 布尔条件查询
2、PhraseQuery 短语查询
3、PrefixQuery 前缀查询
4、FilteredQuery 过滤查询TopDocs 排名、搜索度
2.7、Lucene高亮显示处理
在Lucene的org.apache.lucene.search.highlight包中提供了关于高亮显示检索关键字的工具。使用百度、 Google搜索的时候,检索结果显示的时候,在摘要中实现与关键字相同的词条进行高亮显示,百度和Google指定红色高亮显示。
高亮显示,就是根据用户输入的检索关键字,检索找到该关键字对应的检索结果文件,提取对应于该文件的摘要文本,然后根据设置的高亮格式,将格式写入到摘要文本中对应的与关键字相同或相似的词条上。
~~~java
Lucene中org.apache.lucene.search.highlight.SimpleHTMLFormatter类可以构造一个高亮格式,这是最简单的构造方式,例如:
SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter(““, ““);
构造方法声明为public SimpleHTMLFormatter(String preTag, String postTag),因为这种高亮格式是依赖于网页文件的,HTML文件中是以标记(tag)来标识的,即存在一个preTag和一个postTag。
~~~
核心代码展示:
~~~java
public String highlight(Query query,int size,Analyzer analyzer,String text,String field){
try {
Scorer scorer = new QueryScorer(query);
SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter(““,”“);
Highlighter highlighter = new Highlighter(simpleHTMLFormatter,scorer);
Fragmenter fragmenter = new SimpleFragmenter(size);
highlighter.setTextFragmenter(fragmenter);
String bestFragment = highlighter.getBestFragment(analyzer,field,text);
if (bestFragment==null){
return text;
}
return bestFragment;
}catch (Exception e){
e.printStackTrace();
}
return null;
}
~~~
2.8、Lucene 中文分词器
IK Analyzer支持两种分词,一种是最细粒度分词(推荐使用,Ik默认采用最细粒度),还有一种是智能分词。
IKanalyzer目前最新版本只支持到lucene4.x、solr4.x,对于高版本还没有更新。
IK Analyzer 下载地址:http://code.google.com/p/ik-analyzer/downloads/list
虽然Lucene自带一个标准分词器,但是对中文的分词效果不是很理想。
IK分词器默认有三个相关配置文件:
ext.dic(扩展词库);
IKAnalyzer.cfg.xml(扩展词库及停词库配置);
stopword.dic(停词)
配置IKAnalyzer
1)添加配置文件IKAnalyzer.cfg.xml和StopWord词典库stopword.dic文件,把这两个文件放到src目录下,也就是classpath路径下。
~~~java
创建索引时候使用 构造方法中默认是false-最细粒度分词
Analyzer analyzer=new IKAnalyzer(false);
indexWriterConfig = new IndexWriterConfig(analyzer);
搜索索引时使用
Analyzer analyzer=new IKAnalyzer(false);
QueryBuilder parser = new QueryBuilder(analyzer);
~~~
实战案例一:Lucene+PDFBox+POI进行文件检索
~java
核心包下载
PDFBOX:https://pdfbox.apache.org/download.cgi#18x
POI:http://poi.apache.org/download.html#POI-3.16
详情参看视频讲解
~
实战案例二:Lucene+HTTP-Component+Crawl 抓取网页,实现站内新闻检索
~java
核心包下载
HTTP-Component:http://hc.apache.org/downloads.cgi
~
实战案例三:Lucene+GSON+多线程+SpringMVC+Bootstrap抓取某网站商品列表,实现商品内容检索

第三章:Solr 实战开发
3.1、Apache Solr介绍
Solr它是一种开放源码的、基于 Lucene Java 的搜索服务器,易于加入到 Web 应用程序中。Solr 提供了层面搜索(就是统计)、命中醒目显示并且支持多种输出格式(包括XML/XSLT 和JSON等格式)。它易于安装和配置,而且附带了一个基于HTTP 的管理界面。可以使用 Solr 的表现优异的基本搜索功能,也可以对它进行扩展从而满足企业的需要。Solr的特性包括:
- 高级的全文搜索功能
- 专为高通量的网络流量进行的优化
- 基于开放接口(XML和HTTP)的标准
- 综合的HTML管理界面
- 可伸缩性-能够有效地复制到另外一个Solr搜索服务器
- 使用XML配置达到灵活性和适配性
- 可扩展的插件体系
- 支持像英语,德语,中国,日本,法国和许多主要语言
3.2、Apache Solr和Lucene的关系
Solr 与Lucene 并不是竞争对立关系,恰恰相反Solr 依存于Lucene ,因为Solr 底层的核心技术是使用Apache Lucene 来实现的,简单的说Solr 是Lucene 的服务器化。需要注意的是Solr 并不是简单的对Lucene 进行封装,它所提供的大部分功能都区别于Lucene。
3.3、Apache Solr 相关目录说明
我们可以在http://archive.apache.org/dist/lucene/solr/获取Solr的版本
以4.10.3为案例,下载解压之后如图所示:
Solr程序包的结构说明
bin :solr相关运行脚本
docs:相关API参考文档和wiki资料等
licenses:存放了solr相关证书
contrib :solr相关扩展的jar包
dist :存放Solr 构建完成的JAR 文件、WAR 文件和Solr 依赖的JAR 文件。
example :是一个安装好的Jetty 中间件,其中包括一些样本数据和Solr 的配置信息。
example/etc :Jetty 的配置文件。
example/multicore :当安装Slor multicore 时,用来放置多个Solr 主目录。
example/solr :默认安装时一个Solr 的主目录。
example/example-DIH:数据库做索引数据源的示例
example/webapps :Solr 的WAR 文件部署在这里。
src :Solr 相关源码。
src/java :Slor 的Java 源码。
src/scripts :一些在大型产品发布时一些有用的Unix bash shell 脚本。
src/solrj :Solr 的Java 客户端。
src/test :Solr 的测试源码和测试文件。
src/webapp :Solr web 管理界面。管理界面的Jsp 文件都放在web/admin/ 下面,可以根据你的需要修改这些文件。
Solr 主目录结构说明
bin :建议将集群复制脚本放在这个目录下。
conf :放置配置文件。
conf/schema.xml :建立索引的schema 包含了字段类型定义和其相关的分析器。
conf/solrconfig.xml :这个是Solr 主要的配置文件。
conf/xslt :包含了很多xslt 文件,这些文件能将Solr 的XML 的查询结果转换为特定的格式,比如:Atom/RSS。
data :放置Lucene 产生的索引数据。
lib :放置可选的JAR 文件比如对Slor 扩展的插件,这些JAR 文件将会在Solr 启动时加载。
3.4、搭建Apache Solr 开发环境
准备步骤 :Tomcat 8以上、JDK7以上。
将 solr 压缩包解压,并将solr-4.10.3\example\webapps文件夹下有solr.war,将之复制到Tomcat\webapps\目录下,并启动tomcat解压
将 solr 压缩包中 solr-4.10.3\example\lib\ext所有jar包 全部复制到 Tomcat\ webapps\solr\WEB-INF\lib目录中
将 solr 压缩包中 solr-5.3.0/ server/resources /log4j.properties 复制到Tomcat\ webapps\solr\WEB-INF 目录中
创建一个solr_home 的目录(用户可以根据操作系统决定),并将 solr 压缩包中example下的solr 目录除了bin所有文件复制D:\solr_home目录下,如图所示:

打开Tomcat/webapps/solr/WEB-INF下的web.xml,增加如下配置内容(初始状态下该内容是被注释掉的):
~~~xml
solr/home
D:/solr_home
java.lang.String
将中的内容改成你的solrhome路径,这里是D:/solr_home
这项配置,主要是建立tomcat 与solr之间的关系的,它的作用是让tomcat找到你所配置的solr 目录。
~~~
- 启动tomcat,在地址栏输入如下:http://localhost:8080/solr如下所示
3.5、Apache Solr 从MySQL数据库中导入数据
导入solr自带的数据导入包放到tomcat 中的solr工程的web-inf下lib中
在collection1的目录中添加lib包,把data-import需要用的包拷贝到lib中
其中包括mysql包在磁盘中的solr_home 打开solrconfig.xml 添加如下代码
~xml
data-config.xml
~
在同级目录下创建一个data-config.xml文件,添加如下内容
~xml
3.6、使用Java Client 对Apache Solr进行CRUD操作
Solr基础知识
Solr 包装并扩展了 Lucene,所以它们使用很多相同的术语。更重要的是,Solr 创建的索引与 Lucene 搜索引擎库完全兼容。
在 Solr 和 Lucene 中,使用一个或多个
Document
来构建索引。Document
包括一个或多个Field
。Field
包括名称、内容以及告诉 Solr 如何处理内容的元数据。例如,Field
可以包含字符串、数字、布尔值或者日期,也可以包含您想添加的任何类型。
属性名称 | 说明 |
---|---|
indexed | Indexed Field 可以进行搜索和排序。您还可以在 indexed Field 上运行 Solr 分析过程,此过程可修改内容以改进或更改结果, 表示需不需要建立索引,以便之后对这个field进行查询 |
stored | stored Field 内容保存在索引中。 表示需不需要随索引同时存储这个field本身的内容,以便查询时直接从结果中获取该内容,一般大数据(比如文件内容本身)不会和索引一起保存,节省资源,防止索引过大。 |
2.Solr索引操作
在 Solr 中,通过向部署在 servlet 容器中的 Solr Web 应用程序发送 HTTP 请求来启动索引和搜索。Solr 接受请求,确定要使用的适当 SolrRequestHandler
,然后处理请求。通过 HTTP 以同样的方式返回响应。默认配置返回 Solr 的标准 XML 响应。您也可以配置 Solr 的备用响应格式。
索引就是接受输入(本例中是博客条目、关键字和其他元数据)并将它们传递给 Solr,从而在 HTTP Post
XML 消息中进行索引的过程。您可以向 Solr 索引 servlet 传递四个不同的索引请求:
- add/update 允许您向 Solr 添加文档或更新文档。直到提交后才能搜索到这些添加和更新。
- commit 告诉 Solr,应该使上次提交以来所做的所有更改都可以搜索到。
- optimize 重构 Lucene 的文件以改进搜索性能。索引完成后执行一下优化通常比较好。如果更新比较频繁,则应该在使用率较低的时候安排优化。一个索引无需优化也可以正常地运行。优化是一个耗时较多的过程。
- delete 可以通过 id 或查询来指定。按 id 删除将删除具有指定 id 的文档;按查询删除将删除查询返回的所有文档。
3.Solr搜索命令
Solr 接受 HTTP GET
和 HTTP POST
查询消息。收到的查询由相应的 SolrRequestHandler
进行处理。出于本文的讨论目的,我们将使用默认的 StandardRequestHandler
。
Solr 中更常见的查询参数。这些参数如下所示:
参数 | 描述 | 示例 |
---|---|---|
q | Solr 中用来搜索的查询。有关该语法的完整描述,请参阅 参考资料 中的 “Lucene QueryParser Syntax”。可以通过追加一个分号和已索引且未进行断词的字段(下面会进行解释)的名称来包含排序信息。默认的排序是 score desc ,指按记分降序排序。 | q=myField:Java AND otherField:developerWorks; date asc 此查询搜索指定的两个字段并根据一个日期字段对结果进行排序。 |
start | 将初始偏移量指定到结果集中。可用于对结果进行分页。默认值为 0。 | start=15 返回从第 15 个结果开始的结果。 |
rows | 返回文档的最大数目。默认值为 10。 | rows=25 |
fq | 提供一个可选的筛选器查询。查询结果被限制为仅搜索筛选器查询返回的结果。筛选过的查询由 Solr 进行缓存。它们对提高复杂查询的速度非常有用。 | 任何可以用 q 参数传递的有效查询,排序信息除外。 |
hl | 当 hl=true 时,在查询响应中醒目显示片段。默认为 false。参看醒目显示参数上的 Solr Wiki 部分可以查看更多选项。 | hl=true |
fl | 作为逗号分隔的列表指定文档结果中应返回的 Field 集。默认为 “* ”,指所有的字段。“score” 指还应返回记分。 | *,score |
用于 StandardRequestHandler
的 Solr 查询语法与 Lucene QueryParser
支持的查询语法相同,只是前者加入了一些排序支持。示例应用程序对输入的值几乎没有进行验证,而且没有演示如查询增强、短语、范围筛选等功能,所有这些功能在 Solr 和 Lucene 中都有效。
- 布尔运算符:默认情况下,用于合并搜索条目的布尔运算符是
OR
。将它设为AND
要求匹配的文档中出现所有的条目。 - 结果数目:指定返回的最大结果数目。
- 开始:结果集中开始的偏移量。此参数可用于分页。
- 醒目显示:醒目显示匹配文档字段的条目。
实战案例一:
Apache Solr 对产品表的维护,包括添加、删除、修改索引
Apache Solr 对产品表的各种查询方式
第四章:Nutch网络爬虫
4.1、Nutch简介

Nutch 是一个开源Java 实现的搜索引擎。它提供了我们运行自己的搜索引擎所需的全部工具。包括全文搜索和Web爬虫。
Nutch的创始人是Doug Cutting,他同时也是Lucene、Hadoop和Avro开源项目的创始人。
Nutch诞生于2002年8月,是Apache旗下的一个用Java实现的开源搜索引擎项目,自Nutch1.2版本之后,Nutch已经从搜索引擎演化为网络爬虫,接着Nutch进一步演化为两大分支版本:1.X和2.X,这两大分支最大的区别在于2.X对底层的数据存储进行了抽象以支持各种底层存储技术。
在Nutch的进化过程中,产生了Hadoop、Tika、Gora和Crawler Commons四个Java开源项目。如今这四个项目都发展迅速,极其火爆,尤其是Hadoop,其已成为大规模数据处理的事实上的标准。Tika使用多种现有的开源内容解析项目来实现从多种格式的文件中提取元数据和结构化文本,Gora支持把大数据持久化到多种存储实现,Crawler Commons是一个通用的网络爬虫组件。
Nutch目标
Nutch 致力于让每个人能很容易, 同时花费很少就可以配置世界一流的Web搜索引擎. 为了完成这一宏伟的目标, Nutch必须能够做到:
- 每个月取几十亿网页
- 为这些网页维护一个索引
- 对索引文件进行每秒上千次的搜索
- 提供高质量的搜索结果
- 以最小的成本运作
4.2、Nutch Crawl 介绍
Crawler的重点在两个方面,Crawler的工作流程和涉及的数据文件的格式和含义。数据文件主要包括三类,分别是web database,一系列的segment加上index,三者的物理文件分别存储在爬行结果目录下的db目录下webdb子文件夹内,segments文件夹和index文件夹。
一次爬行会产生很多个segment,每个segment内存储的是爬虫Crawler在单独一次抓取循环中抓到的网页以及这些网页的索引。Crawler爬行时会根据WebDB中的link关系按照一定的爬行策略生成每次抓取循环所需的fetchlist,然后Fetcher通过fetchlist中的URLs抓取这些网页并索引,然后将其存入segment。Segment是有时限的,当这些网页被Crawler重新抓取后,先前抓取产生的segment就作废了。在存储中。Segment文件夹是以产生时间命名的,方便我们删除作废的segments以节省存储空间。
Index是Crawler抓取的所有网页的索引,它是通过对所有单个segment中的索引进行合并处理所得的。Nutch利用Lucene技术进行索引,所以Lucene中对索引进行操作的接口对Nutch中的index同样有效。但是需要注意的是,Lucene中的segment和Nutch中的不同,Lucene中的segment是索引index的一部分,但是Nutch中的segment只是WebDB中各个部分网页的内容和索引,最后通过其生成的index跟这些segment已经毫无关系了。
Web database,也叫WebDB,其中存储的是爬虫所抓取网页之间的链接结构信息,它只在爬虫Crawler工作中使用而和Searcher的工作没有任何关系。WebDB内存储了两种实体的信息:page和link。Page实体通过描述网络上一个网页的特征信息来表征一个实际的网页,因为网页有很多个需要描述,WebDB中通过网页的URL和网页内容的MD5两种索引方法对这些网页实体进行了索引。Page实体描述的网页特征主要包括网页内的link数目,抓取此网页的时间等相关抓取信息,对此网页的重要度评分等。同样的,Link实体描述的是两个page实体之间的链接关系。WebDB构成了一个所抓取网页的链接结构图,这个图中Page实体是图的结点,而Link实体则代表图的边。
4.3、Nutch和Lucene的关系
Nutch是基于Lucene的。Lucene为Nutch提供了文本索引和搜索的API。
一个常见的问题是:我应该使用Lucene还是Nutch?
回答是:如果不抓取数据的话,就使用Lucene。
常见的应用场合是:你有数据源,需要为这些数据提供一个搜索页面。在这种情况下,最好的方式是直接从数据库中取出数据并用Lucene API 建立索引。
在Nutch中,Crawler操作的实现是通过一系列子操作的实现来完成的:
下面就是这些子操作的功能描述以及命令行,命令行在括号中。
- 创建一个新的WebDb (admin db -create).
- 将抓取起始URLs写入WebDB中 (inject).
- 根据WebDB生成fetchlist并写入相应的segment(generate).
- 根据fetchlist中的URL抓取网页 (fetch).
- 根据抓取网页更新WebDb (updatedb).
- 循环进行3-5步直至预先设定的抓取深度.
- 根据WebDB得到的网页评分和links更新segments (updatesegs).
- 对所抓取的网页进行索引(index).
- 在索引中丢弃有重复内容的网页和重复的URLs (dedup).
- 将segments中的索引进行合并生成用于检索的最终index(merge).
第五章:Nutch结合Solr实现站内检索
5.1、配置Apache Solr 0.9版本
学习Apache Solr 0.9版本是一个对于初学者比较适合的
配置步骤如下:
第一步:
https://archive.apache.org/dist/nutch/
在指定的磁盘中解压,具体配置如下:
在conf文件下找到一个crawl-urlfilter.txt文件
修改如下:
~~~java
# accept hosts in MY.DOMAIN.NAME
+^http://([a-z0-9]*.)*sina.com.cn/
# skip everything else
-.
将MY.DOMAIN.NAME修改成要抓取的网站,例如
+^http://([a-z0-9]*.)*sina.com.cn/ 使用正则表达式进行过滤
~~~
第二步:配置nutch-site.xml文件
在之间添加如下代码
~xml
http.agent.name
HD nutch agent
http.agent.version
1.0
~
第三步:
将解压的文件中的war文件,拷贝到tomcat7的webapp中,运行tomcat,自动解压
打开nutch文件夹,本身做了国际化的功能,找到search.jsp文件,有bug,主要是转义符号的问题,已经修改。
找到webapps/ROOT/WEB-INF/classes/nutch-site.xml 修改如下:
~xml
searcher.dir
/opt/nutch-1.2/crawl.demo
配置的是nutch存放索引的路径,可以根据不同的操作系统来定
~
第四步:
在Nutch根目录下 创建一个urls目录,在该目录下创建一个seed.txt文件,填入要抓取的网站地址,例如:
第五步:
解决中文乱码问题,在tomcat的conf下的server中,添加如下代码
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
acceptCount="100"
disableUploadTimeout="true"
URIEncoding="UTF-8" useBodyEncodingForURI="true"
/>
第六步:执行抓取索引操作
bin/nutch crawl /路径/urls -dir /路径/crawl.demo -depth 2 -threads 4 -topN 5 >& /路径/crawl.log
路径:表示的是 /opt/nutch-1.2/crawl.demo的文件路径
crawl:通知 nutch.jar,执行抓取的main方法
urls: 存放需要抓取的url的文件目录,需要抓取的url都写在了url.txt文件中
dir: 抓取命令执行完后,存放结果的命令
depth: 爬行的深度 初次建议为1,也可以用网页的几级页面来表示
threads: 处理的线程数
topN:指在每层的深度上所要抓取的最大的页面数,完全抓取可设定为1万到100万,这取决于网站资源数量
配置完毕,启动tomcat ,通过浏览器输入地址。
5.2、Nutch集成Solr配置环境搭建
采用apache-nutch-1.7和solr-4.10.3结合搭建抓取指定网站的数据
第一步:先配置Solr的基本开发环境
http://archive.apache.org/dist/lucene/solr/ 下载对应的版本
目前下载的是4.1.0版本,解压到某一个盘符下,如图所示:
第二步:
将solr解压文件下的example 下的lib中的ext下所有的jar包拷贝到tomcat下的webapps–>solr–>>
WEB-INF–>>lib下
将solr解压文件中的resource下的log4j.properties文件拷贝到tomcat中的WEB-INF下,
第三步:
为solr创建solr_home 目录
solr_home可以创建在某一个盘符的根目录下。创建成功了,将solr解压文件中的example–>>solr–>>collection1文件下所有文件拷贝到solr_home中第四步:
配置tomcat中solr 的web.xml文件

第五步:
打开tomcat下得solr中的web.xml,修改如下配置
~xml
solr/home
/Users/luoliwen/Documents/solr_home
java.lang.String
~第六步:解压Nutch压缩文件
Nutch对应的文件可以从以下网址下载
https://archive.apache.org/dist/nutch/
将解压的Nutch文件conf中的schema-solr4.xml 拷贝替换掉solr_home 中的collection1 conf中的schema.xml的内容。
在schema.xml中添加如下字段~xml
~第七步:打开Nutch中conf下的nutch-site.xml
~xml
http.agent.name
HD nutch agent
http.agent.version
1.0
searcher.dir
/Users/luoliwen/Documents/apache-nutch-1.7/crawl.demo
~其中,/Users/luoliwen/Documents/apache-nutch-1.7/crawl.demo是表示nutch抓取网页的索引库
打开Nutch中conf下的regex-urlfilter.txt

使用正则表达式匹配要抓取的网站内容
第八步:在Nutch的目录下创建一个urls文件夹,在文件夹里面建立一个seed.txt
填写你要抓取的网站地址,例如:
http://nutch.apache.org/ 注意一定要加反斜杠
同时在Nutch目录下创建一个crawl.demo 文件夹 用于保存nutch抓取的网页内容
第九步:启动solr jar,solr的解压文件下,找到example–>>start.jar文件
执行 java -jar start.jar 命令启动solr
同时启动tomcat服务器
回到Nutch解压文件下bin目录执行 nutch crawl 命令
执行nutch crawl /Users/luoliwen/Documents/apache-nutch-1.7/urls -solr http://localhost:8080/solr/ -depth 3 -topN 5
第六章:Zookeeper 整合Nutch、Solr
6.1、Zookeeper技术介绍
第七章:Nutch2.3整合Hadoop和HBase
7.1、Hadoop介绍