施磊磊的双周汇报书面版10.docx
《施磊磊的双周汇报书面版10.docx》由会员分享,可在线阅读,更多相关《施磊磊的双周汇报书面版10.docx(23页珍藏版)》请在冰点文库上搜索。
施磊磊的双周汇报书面版10
双周汇报
Solr学习笔记
ApacheSolr是一个开源的搜索服务器,Solr使用Java语言开发,主要基于HTTP和ApacheLucene实现。
定制Solr索引的实现方法很简单,用POST方法向Solr服务器发送一个描述所有Field及其内容的XML文档就可以了。
定制搜索的时候只需要发送HTTPGET请求即可,然后对Solr返回的信息进行重新布局,以产生利于用户理解的页面内容布局。
Solr1.3版本开始支持从数据库(通过JDBC)、RSS提要、Web页面和文件中导入数据,但是不直接支持从二进制文件格式中提取内容,比如MSOffice、AdobePDF或其他专有格式。
更重要的是,Solr创建的索引与Lucene搜索引擎库完全兼容。
通过对Solr进行适当的配置,某些情况下可能需要进行编码,Solr可以阅读和使用构建到其他Lucene应用程序中的索引。
此外,很多Lucene工具(如Nutch、Luke)也可以使用Solr创建的索引
Solr的特性包括:
✓高级的全文搜索功能
✓专为高通量的网络流量进行的优化
✓基于开放接口(XML和HTTP)的标准
✓综合的HTML管理界面
✓可伸缩性-能够有效地复制到另外一个Solr搜索服务器
✓使用XML配置达到灵活性和适配性
✓可扩展的插件体系
Solr使用Lucene并且进行了扩展
✓一个真正的拥有动态域(DynamicField)和唯一键(UniqueKey)的数据模式(DataSchema)
✓对Lucene查询语言的强大扩展!
✓支持对结果进行动态的分组和过滤
✓高级的,可配置的文本分析
✓高度可配置和可扩展的缓存机制
✓性能优化
✓支持通过XML进行外部配置
✓拥有一个管理界面
✓可监控的日志
✓支持高速增量式更新(FastincrementalUpdates)和快照发布(SnapshotDistribution)
Schema(模式)
✓定义域类型和文档的域
✓能够驱动智能处理
✓声明式的Lucene分析器规范
✓动态域能够随时增加域
✓拷贝域功能允许对一个域进行多种方式的索引,或者将多个域联合成一个可搜索的域
✓显式类型能够减少对域类型的猜测
✓能够使用外部的基于文件的终止词列表,同义词列表和保护词列表的配置
查询
✓拥有可配置响应格式(XML/XSLT,JSON,Python,Ruby)的HTTP接口
✓高亮的上下文搜索结果
✓基于域值和显式查询的片段式搜索(FacetedSearch)
✓对查询语言增加了排序规范
✓常量的打分范围(Constantscoringrange)和前缀式查询-没有idf,coord,或者lengthNorm因子,对查询匹配的词没有数量限制
✓函数查询(FunctionQuery)-通过关于一个域的数值或顺序的函数对打分进行影响
✓性能优化
核心
✓可插拔的查询句柄(QueryHandler)和可扩展的XML数据格式
✓使用唯一键的域能够增强文档唯一性
✓能够高效地进行批量更新和删除
✓用户可配置的文档索引变化触发器(命令)
✓并发控制的搜索器
✓能够正确处理数字类型,从而能够进行排序和范围搜索
✓能够控制缺失排序域的文档
✓支持搜索结果的动态分组
缓存
✓可配置的查询结果,过滤器,和文档缓存实例
✓可插拔的缓存实现
✓后台缓存热启:
当一个新的搜索器被打开时,可配置的搜索将它热启,避免第一个结果慢下来,当热启时,当前搜索器处理目前的请求。
✓后台自动热启:
当前搜索器缓存中最常访问的项目在新的搜索器中再次生成,能够在索引器和搜索器变化的时候高速缓存常查询的结果
✓快速和小的过滤器实现
✓支持自动热启的用户级别的缓存
复制
✓能够将使用rsync传输时改变的索引部分有效的发布
✓使用拉策略(PullStrategy)来简化增加搜索器
✓可配置的发布间隔能够允许对时间线和缓存使用进行权衡选择
管理接口
✓能够对缓存使用,更新和查询进行综合统计
✓文本分析调试器,能够显示每个分析器每个阶段的结果
✓基于WEB的查询和调试输出:
解析查询输出,Lucene的explain方法细节,能够解释为何某个文档打分低,被排除在结果中等等
Solr服务原理
Solr对外提供标准的http接口来实现对数据的索引的增加、删除、修改、查询。
在Solr中,用户通过向部署在servlet容器中的SolrWeb应用程序发送HTTP请求来启动索引和搜索。
Solr接受请求,确定要使用的适当SolrRequestHandler,然后处理请求。
通过HTTP以同样的方式返回响应。
默认配置返回Solr的标准XML响应,也可以配置Solr的备用响应格式。
索引
可以向Solr索引servlet传递四个不同的索引请求:
1)add/update允许向Solr添加文档或更新文档。
直到提交后才能搜索到这些添加和更新。
2)commit告诉Solr,应该使上次提交以来所做的所有更改都可以搜索到。
3)optimize重构Lucene的文件以改进搜索性能。
索引完成后执行一下优化通常比较好。
如果更新比较频繁,则应该在使用率较低的时候安排优化。
一个索引无需优化也可以正常地运行。
优化是一个耗时较多的过程。
4)delete可以通过id或查询来指定。
按id删除将删除具有指定id的文档;按查询删除将删除查询返回的所有文档。
要实现添加文档索引则只需要调用搜索接口以HTTP POST的方式提交XML报文。
(索引接口:
http:
//master:
8080/solr/update),下面是添加文档的示例报文:
注:
多核心时为这个地址http:
//master:
8080/solr/core0/update/
TWINX2048-3200PRO
CORSAIR XMS 2GB (2 x 1GB) 184-Pin DDR SDRAM Unbuffered DDR 400 (PC 3200) Dual Channel Kit System Memory - Retail
Corsair Microsystems Inc.
electronics
memory
CAS latency 2, 2-3-3-6 timing, 2.75v, unbuffered, heat-spreader
185
5
true
VS1GB400C3
CORSAIR ValueSelect 1GB 184-Pin DDR SDRAM Unbuffered DDR 400 (PC 3200) System Memory - Retail
Corsair Microsystems Inc.
electronics
memory
74.99
7
true
搜索
要实现搜索则只需要调用搜索接口发送HTTP GET,示例:
http:
//master:
8080/solr/select?
indent=on&version=2.2&q=solr&start=0&rows=10&fl=*%2Cscore&qt=standard&wt=standard
注:
多核心时为这个地址http:
//master:
8080/solr/core0/select/
示例中,查询 词“ipad”的请求被提交,要求返回10个结果。
想知道更多有关各种可选查询选项的信息,请参看下文的“搜索语法”部分。
返回的搜索结果报文:
0
6
10
0
*,score
true
content:
"faceted browsing"
1.058217
http:
//localhost/myBlog/solr-rocks-again.html
Solr is Great
solr,lucene,enterprise,search,greatness
Solr has some really great features, like faceted browsing and replication
Solr has some really great features, like faceted browsing and replication
2007-01-07T05:
04:
00.000Z
solr,lucene,enterprise,search,greatness
8
Solr is Great
http:
//localhost/myBlog/solr-rocks-again.html
//localhost/myBlog/solr-rocks-again.html">
Solr has some really great features, like faceted
browsing and replication
源码结构
目录结构说明
我们下载的Solr包后,进入Solr所在的目录,我们可以看到以下几个目录:
build、client、dist、example、lib、site、src。
下面分别对其进行介绍。
1)build:
该目录是在antbuild过程中生成的,其中包含了未被打包成jar或是war的class文件以及一些文档文件。
2)client:
该目录包含了特定语言的Solr客户端API,使得使用其他语言的用户能通过HTTP用XML与Solr进行通话。
现在该目录里面虽然包含javascript、python、ruby三个子目录,但是到目前为止只包含一部分的ruby的代码,其他语言仍是空的。
另外,Solr的Java客户端称为SolrJ,其代码位于src/solrj目录下面。
在之后的文章中我会详细介绍Solr客户端的使用。
3)dist:
该目录包含build过程中产生的war和jar文件,以及相关的依赖文件。
还记得上一篇文章中,我们在build1.4版本的Solr源代码后需要部署example吗?
其实就是将该目录下面的apache-solr-1.4.war部署到Jetty上面去,并重命名为solr.war。
4)example:
这个目录实际上是Jetty的安装目录。
其中包含了一些样例数据和一些Solr的配置。
其中一些子目录也比较重要,这里也对它们稍作介绍。
●example/etc:
该目录包含了Jetty的配置,在这里我们可以将Jetty的默认端口从8983改为8080端口。
●将其中的8983端口换成8080端口。
注意更改端口后启动Jetty可能会提示你没有权限,你需要使用sudojava-jarstart.jar来运行。
●example/multicore:
该目录包含了在Solr的multicore中设置的多个home目录。
在之后的文章中我会对其进行介绍。
●example/solr:
该目录是一个包含了默认配置信息的Solr的home目录。
详见下面的“solrhome说明”
●example/webapps:
Jetty的webapps目录,该目录通常用来放置Java的Web应用程序。
在Solr中,前面提到的solr.war文件就部署在这里。
5)lib:
该目录包含了所有Solr的API所依赖的库文件。
其中包括Lucene,Apachecommonsutilities和用来处理XML的Stax库。
6)site:
该目录仅仅包含了Solr的官网的网页内容,以及一些教程的PDF文档。
7)src:
该目录包含了Solr项目的整个源代码。
这里对其各个子目录也做相应的介绍。
●src/java:
该目录存放的是Solr使用Java编写的源代码。
●src/scripts:
该目录存放的是配置Solr服务器的UnixBashShell脚本,在后面介绍多服务器配置中将会有重要的作用。
●src/solrj:
前面提到过该目录存放的是Solr的Java版本的客户端代码。
●src/test:
该目录存放的是测试程序的源代码和测试文件。
●src/webapp:
该目录存放的是管理Solr的Web页面,包括Servlet和JSP文件,其构成了前面提到的WAR文件。
管理Solr的JSP页面在web/admin目录下面,如果你有兴趣折腾Solr可以找到相应的JSP的页面对其进行设置
Solrhome说明
所谓的Solrhome目录实际上是一个运行的Solr实例所对应的配置和数据(Lucene索引)。
在上一篇文章中我提到过在Solr的example/solr目录就是一个Solr用做示例的默认配置home目录。
实际上example/multicore也是一个合法的Solrhome目录,只不过是用来做mult-core设置的。
那么我们来看看example/solr这个目录里面都有些什么。
example/solr目录下主要有以下一些目录和文件:
1)bin:
如果你需要对Solr进行更高级的配置,该目录建议用来存放Solr的复制脚本。
2)conf:
该目录下面包含了各种配置文件,下面列出了两个最为重要的配置文件。
其余的.txt和.xml文件被这两个文件所引用,如用来对文本进行特殊的处理。
●conf/schema.xml:
该文件是索引的schema,包含了域类型的定义以及相关联的analyzer链。
●conf/solrconfig.xml:
该文件是Solr的主配置文件。
●conf/xslt:
该目录包含了各种XSLT文件,能将Solr的查询响应转换成不同的格式,如:
Atom/RSS等。
3)data:
包含了Lucene的二进制索引文件。
4)lib:
该目录是可选的。
用来放置附加的JavaJAR文件,Solr在启动时会自动加载该目录下的JAR文件。
这就使得用户可以对Solr的发布版本(solr.war)进行扩展。
如果你的扩展并不对Solr本身进行修改,那么就可以将你的修改部署到JAR文件中放到这里。
Solr是如何找到运行所需要的home目录的呢?
Solr首先检查名为solr.solr.home的Java系统属性,有几种不同的方式来设置该Java系统属性。
一种不管你使用什么样的Java应用服务器或Servlet引擎都通用的方法是在调用Java的命令行中进行设置。
所以,你可以在启动Jetty的时候显式地指定Solr的home目录java-Dsolr.solr.home=solr/-jarstart.jar。
另一种通用的方法是使用JNDI,将home目录绑定到java:
comp/env/solr/home。
并向src/webapp/web/WEB-INF/web.xml添加以下一段代码:
1
2solr/home
3solr/
4java.lang.String
5
实际上这段XML在web.xml文件中已经存在,你只需要把原来注释掉的xml取消注释,添加你所要指向的home目录即可。
因为修改了web.xml文件,所以你需要运行antdist-war来重新打包之后再部署WAR文件。
最后,如果Solr的home目录既没有通过Java系统属性指定也没有通过JNDI指定,那么他将默认指向solr/。
在产品环境中,我们必须设置Solr的home目录而不是让其默认指向solr/。
而且应该使用绝对路径,而不是相对路径,因为你有可能从不同的目录下面启动应用服务器。
注:
Jetty是一个开源的servlet容器,它为基于Java的web内容,例如JSP和servlet提供运行环境。
Jetty是使用Java语言编写的,它的API以一组JAR包的形式发布。
开发人员可以将Jetty容器实例化成一个对象,可以迅速为一些独立运行(stand-alone)的Java应用提供网络和web连接。
solr的各包的说明
分析ApacheSolr的各个包,力图详细地分析Solr的设计和架构。
ApacheSolr由12个包组成,如下:
1.org.apache.solr.analysis
2.org.apache.solr.core
3.org.apache.solr.request
4.org.apache.solr.schema
5.org.apache.solr.search
6.org.apache.solr.search.function
7.org.apache.solr.servlet
8.org.apache.solr.tst
9.org.apache.solr.update
10.org.apache.solr.util
11.org.apache.solr.util.test
12.org.apache.solr.util.xlst
我们先从使用者的角度出发,最先看到的当然是servlet,因为Solr本身是个独立的网络应用程序,需要在Servlet容器中运行来提供服务,所以servlet是用户接触的最外层。
我们看看org.apache.solr.servlet包。
这个包很简单,只有两个类:
SolrServlet和SolrUpdateServlet.我们很容易从类名中猜出这两个类的用途。
SolrServlet类继承HttpServlet类,只有四个方法:
∙init()
∙destroy()
∙doGet()
∙doPost()
SolrServlet类中除了普通的Java类对象(包括Servlet相关的)外,有四个Solr本身的类,还有一个Solr本身的异常。
其中两个类和一个异常属于org.apache.solr.core包,两个类属于org.apache.solr.request包。
属于core包的有:
∙Config:
∙SolrCore:
属于request包的有:
∙SolrQueryResponse:
∙QueryResponseWriter:
分析一下这个SolrServlet类。
首先servlet会调用init()方法进行初始化:
通过Context查找java:
comp/env/solr/home来确定Solr的主目录(home),接着调用Config.setInstanceDir(home)方法设置这个实例的目录。
然后通过SolrCore.getSolrCore()来获得一个SolrCore实例。
destroy()方法将会在Servlet对象销毁时调用,仅仅调用core.close()关闭SolrCore实例。
当用户请求进来时doPost()简单地将任务交给doGet()完成,主要的任务由doGe