赞
踩
一、简洁
Solr是一个开源的,企业级搜索服务器。她已经是一个成熟的产品,用于强化网络站点的搜索功能,包括内部局域网。
她是用Java语言编写。使用HTTP和XML进行数据传输,Java的掌握对于学习Solr不是必须的。除了能返回搜索
结果外,还有包括高亮搜索关键字,方位导航(已广泛用于电子商务网站),查询关键字拼写校验,自动查询建议
和 “类似”查询 帮助更好定位搜索。
二、Lucene,solr的基础引擎
在相信介绍Solr前,我们先从Apache Lucene开始,Solr的核心基础引擎。Lucene是一个开源的,高效的
文本搜索引擎。Lucene是由Doug Cutting在2000年开发的,并且伴随着强大的在线社区不断进化和成熟。
Lucene不是一个服务器,也不是一个网络爬虫。这一点非常重要,她没有任何配置文件。我们需要编写代码来
存贮和查询在磁盘上的索引。
下面是Lucene的一些主要特征:
三、Solr,是Lucene的服务器化产物
在对Lucene的了解后,Solr可以理解为Lucene的服务器化产品。但她不是对Lucene的一次简单封装,Solr的大多数特征都与Lucene不同。Solr 和 Lucene 的界限经常是模糊的。以下是Solr的主要特性:
运行时做性能统计,包括缓存 命中/错过 率
查询表单 来 搜索索引。
以柱状图形式 展示 频繁被查询的关键字
详细的“得分计算和文本解析”分析。
通过配置XML 来添加和配置 Lucene的文本分析库
引入“搜索字段类型”的概念(这个非常重要,然而在Lucne中没有)。类型用作表示日期和一些特殊的排序问题。
以上特征都会在下面的章节内详述。
四、Solr 于数据库技术的比较
对于开发人员而言,数据库技术(特别是关系数据库)已经成为一个必须学习的知识。数据库和Lucene的搜索索引并没有显著的不同。假设我们已经非常熟悉数据库知识,现在来描述下她和Lucene有什么不同。(这里来帮助更好了解Solr)
最大的不同是,Lucene可以理解为一个 只有一张简单表格 的数据库,没有任何的关系查询(即JOINS)。这听上去很疯狂,不过记住索引只是为了去支持搜索,而不是去标识一条数据。所以数据库可以去遵守“第三范式”,而索引就不会如此,表格中尽可能多的包含会被搜索到的数据而已。用来补充单表的是,一个域(列)中可以有多值。
其他一些显著的不同:
五、正式开始Solr
Solr是用Java编写的,不过我们不需要对Java非常了解。如果需要扩展Solr的功能,那我们需要了解Java。
我们需要掌握的是命令行操作,包括Dos和Unix。
在正式开始前,我们可能需要安装以下一些包:
Solr 发布包下的目录结构:
example/etc:Jetty的配置文件。可以修改监听端口(默认8983)
example/multicore:多核环境下,solr的根目录(后面会具体讨论)
example/solr:默认环境下的solr根目录
example/webapps:Solr的WAR包部署在这里
src/java:Solr的源代码,用Java编写。
src/scripts:Unix的bash shell脚本,应用与在大型应用中部署多个Solr服务。
src/solrj:Solr Java的客户端。
src/webapp:Solr web端的管理员用户界面,包括Servlets和JSP。这些其实也都是War中的内容。
注意:要看Java源码的话,src/java下是主要的Solr源码;src/common下是一部分通用类,供server端和solrj客户端;src/test中是测试代码;src/webapp/src下是servlet代码;
六、Solr的根目录
Solr的根目录下包括Solr的配置和运行Solr实例需要的数据。
Sole有一个样例根目录,在example/solr下,我们将会使用这个
另一个更技术层面的,在example/solr下,也是Solr的一个根目录不过是用在多核的环境下,稍后讨论。
让我们来看下根目录下有些什么:
conf/schema.xml:这里是索引的概要,包括 域类型(field type)定义和相关分析器链。
conf/sorconfig.xml:这是Solr配置的主文件。
conf/xslt:这个目录薄厚一些XSLT文件,用来把Solr搜索结果(XML)转换为其他形式,例如Atom/RSS。
七、Solr如何找到自己的根目录
Solr启动后的第一件事是从根目录加载配置信息。这可以通过好几种方式来指定。
这里修改了web.xml,需要使用ant dist-war重新打包部署。这里仅仅如此还不够,需要设置JNDI,这里就不深入了。
PS:JNDI需要设置2个环境变量,具体查看EJB相关笔记。
设置完根路径后,在Solr启动中的log会显示:
Aug 7, 2008 4:59:35 PM org.apache.solr.core.Config getInstanceDir
INFO: Solr home defaulted to 'null' (could not find system property or JNDI)
Aug 7, 2008 4:59:35 PM org.apache.solr.core.Config setInstanceDir
INFO: Solr home set to 'solr/'
八、部署和运行Solr
部署就是apach-solr-1.4.war。这里不包含Solr的根目录。
这里我们以自带的Jetty为例子,进入example目录
cd example
java -jar start.jar
看到下面这句日志,即启动完成:
2010-07-09 15:31:06.377::INFO: Started SocketConnector @ 0.0.0.0:8983
在控制台点击Ctrl-C 可以关闭服务器。
0.0.0.0表示她监听来自任务主机的请求,8983是端口号。
此时,可以进入连接:http://localhost:8983/solr,如果启动失败会显示原因,如果成功即可看到管理员入口(http://localhost:8983/solr/admin/)。
九、简单浏览下Solr
顶部灰色部分:
导航栏上的功能:
Assistance 部分包括一些在线的帮助信息。
十、装在示例数据
Solr有一些示例数据和装载脚本,在example/exampledocs下。
进入example/exampledoce下,输入:
java -jar post.jar *.xml (如果在unix环境下,就运行post.sh)
post.jar是一个简单的程序,会遍历所有的参数(这里就是*.xml),然后对本机正运行的Solr(example)服务器的默认配置(http://localhost:8983/solr/update) 发送post请求(HTTP)。这里可以看下post.sh,就可以了解在干什么了。
可以在控制台命令行中看到发送的文件:
SimplePostTool: POSTing files to http://localhost:8983/solr/update..
SimplePostTool: POSTing file hd.xml
SimplePostTool: POSTing file ipod_other.xml
SimplePostTool: POSTing file ipod_video.xml
SimplePostTool: POSTing file mem.xml
SimplePostTool: POSTing file monitor.xml
SimplePostTool: POSTing file monitor2.xml
SimplePostTool: POSTing file mp500.xml
SimplePostTool: POSTing file payload.xml
SimplePostTool: POSTing file sd500.xml
SimplePostTool: POSTing file solr.xml
SimplePostTool: POSTing file utf8-example.xml
SimplePostTool: POSTing file vidcard.xml
SimplePostTool: COMMITting Solr index changes..
最后一行会执行commit操作,保证之前的文档都被保存,并可见。
理论上post.sh 和 post.jar是可以用在产品脚本上的,但这里仅仅用作示例。
这里取其中一个文件monitor.xml 看下:
这个发送给Solr的文件非常简单。这里只用了一些简单的标签,不过都是非常重要的。
<add>标签中可以放置多个<doc>标签(一个doc代表一个document),在大量数据装载时这样做能提高性能。
Solr在每个POST请求中都会收到一个<commit/>标签。更多的一些特性会在之后介绍。
十一、一次简单的搜索。
在管理员界面,让我们运行一次简单的搜索。
在管理员界面,点击查询按钮,或进入FULL INTERFACE再作更详细的查询。
在我们查看XML输出文件之前,先看下URL和参数信息:
http://localhost:8983/solr/select/?q=monitor&version=2.2&start=0&rows=10&indent=on.
然后浏览器中会显示输出的用XML标识的搜索结果,如下:
这只是一个简单的查询结果,可以加入例如高亮显示等查询条件,然后在result标记后会有更多信息。
十二、一些统计信息
进入http://localhost:8983/solr/admin/stats.jsp。
在这里,当我们没有加载任何数据时,numDocs显示0,而现在显示19。
maxDocs的值取决于当你删除一个文档但却没有提交。
可以关注以下的一些handler:
/update,standard。
注意:这些统计信息都是实时的,不在磁盘上做保存。
十三、solrconfig.xml
这里包含很多我们可以研究的参数,现在先让我们看下<requestHandler>下定义的 request handers。
当我们通过POST通知Solr(如索引一个文档)或通过GET搜索,都会有个特定的request hander做处理。
这些handers可以通过URL来注册。之前我们加载文档时,Solr通过以下注册的handler做处理:
<requestHandler name="/update" class="solr.XmlUpdateRequestHandler" />
而当使用搜索时,是使用solr.SearchHandler(上面的XML定义了)
通过URL参数或POST中的参数,都可以调用这些request handler
也可以在solrconfig.xml中通过default,appends,invariants来指定。
这里的一些参数等于是默认的,就像已经放在了URL后面的参数一样。
十四、一些重要的Solr资源
十五、查询参数
fl=*,score&q.op=AND&start=0&rows=16&hl=true&hl.fl=merHeading&hl.snippets=3&hl.simple.pre=<fontcolor=red>&hl.simple.post=</font>&facet=true&facet.field=merCategory&q=+(merHeading:你好+AND+merHeadingWithWord:潘)+merActualendTime:[1239264030468TO1240473630468]&sort=merActualendTimeasc
fl表示索引显示那些field(*表示所有field, score 是solr 的一个匹配热度)
q.op 表示q 中 查询语句的 各条件的逻辑操作 AND(与) OR(或)
start 开始返回条数
rows 返回多少条
hl 是否高亮
hl.fl 高亮field
hl.snippets 不太清楚(反正是设置高亮3就可以了)
hl.simple.pre 高亮前面的格式
hl.simple.post 高亮后面的格式
facet 是否启动统计
facet.field 统计field
q 查询语句(类似SQL) 相关详细的操作还需lucene 的query 语法
sort 排序
十六、删除索引
post "<delete><id>42</id></delete>"
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
对一个document进行索引时,其中的每个field中的数据都会经历分析(根据上面的一个博客可以知道,分析就是组合分词和过滤),最终将一句话分成单个的单词,去掉句子当中的空白符号,大写转换小写,复数转单数,去掉多余的词,进行同义词代换等等。
避免重复处理。
-----------------------------------------------------------------------------------------------------------------------------------
lucene对索引的更新比solr麻烦,solr只需要调用一个函数UpdateRequest.setAction(AbstractUpdateRequest.ACTION.COMMIT, false, false)就完成了更新,而lucene需要先删除再更新,否则就变成增量索引了
lucene更新索引:http://langhua9527.iteye.com/blog/582347
前面已经简单介绍了solr的安装与使用,下面来看看如何用客户端solrj来建立索引及查询
solrj要成功运行,需要导入下列包才行
From /dist:
apache-solr-solrj-3.1.0.jar
From /dist/solrj-lib:
commons-codec-1.4.jar
commons-httpclient-3.1.jar
jcl-over-slf4j-1.5.5.jar
slf4j-api-1.5.5.jar
下面这个包需要去官方下载,因为本人在solr3.1中是没发现这个jar包的,估计是在低版本中有
slf4j-jdk14-1.5.5.jar
solr从1.4版本开始,将apache Tika合并进来,Tika是一个内容抽取的工具集合(a toolkit for text extracting)。它集成了POI, Pdfbox 并且为文本抽取工作提供了一个统一的界面。solr中利用这个工具可以很简单实现对pdf、word等富文本的提取
我的是3.1版,在实现过程中,走了很多弯路,终于还是自己解决了,下面分享一下
刚开始一直在solr.request(up)这一步报错,看tomcat报错是说没有ignored_meta类型,刚开始一直不理解,因为我的配置文件schema.xml中根本没有这种类型,刚开始还以为是版本原因导致,专门去下了solr1.4版,运行果然不报错,后来才想到是因为前面在入门例子中,我修改了配置文件schema.xml,而solrconfig.xml配置文件在/update/extract节点处,有ignored_类型引用,后来我在schema.xml加入ignored_类型后,运行正常
后面研究一下如何用solrj进行查询,并将查询结果展示在web页面上,因为查询结果返回的是xml形式
如果solr是1.3版本或以下,请参考:http://wiki.apache.org/solr/UpdateRichDocuments
参考资料:
1.http://wiki.apache.org/solr/ExtractingRequestHandler
Solr
Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果;
Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。
文档通过Http利用XML 加到一个搜索集合中。查询该集合也是通过http收到一个XML/JSON响应来实现。它的主要特性包括:高效、灵活的缓存功能,垂直搜索功能,高亮显示搜索结果,通过索引复制来提高可用性,提供一套强大Data Schema来定义字段,类型和设置文本分析,提供基于Web的管理界面等。
==================================================================================
Apache Solr:基于Lucene的可扩展集群搜索
关于Solr的未来计划,Seeley提到了更多的可扩展性、对大集群更方便的配置和管理、基于区域和实时的搜索、重构以使用Spring配置插件。
Apache Solr项目,是一款基于Apache Lucene的开源企业搜索服务器,最近发布了1.3版。InfoQ采访了Solr的创建者Yonik Seeley,了解了新版本的更多信息和Solr提供给最终用户的功能。
Seeley首先描述了目标用户:“需要搜索框、分面浏览(导航)或者两者结合的任何人”,Solr的关键特性包括:
基于标准的开放接口——Solr搜索服务器支持通过XML、JSON和HTTP查询和获取结果。
易管理——Solr可以通过HTML页面管理,服务器统计数据以JMX输出,Solr配置通过XML完成。
分面浏览——搜索结果自动分类。
突出显示命中词——匹配的字符自动在搜索结果中高亮显示。
可伸缩性——快速增量更新和快照分发/复制到其他服务器。
灵活的插件体系——新功能能够以插件的形式方便的添加到Solr服务器上。
Seeley同时谈到了该版本中的主要新功能:
分布式搜索——索引现在可以透明的分割成多个部分,单个Solr服务器基于各个配置和模式支持多索引,无须停止Solr服务器就可以改动主要的配置。
扩展了查询功能——包含了一个新的Java客户端(SolrJ)和若干新功能,例如直接配置对于特定查询哪些文档首先命中、近似命中、搜索过期、记录分面时间和拼写检查
增强了数据导入工具——数据库和其他结构化数据源现在都可以导入、映射和转化。
更多可定制扩展点——存在一个新的更新处理器链,允许在查询时修改和重定向文档;一个搜索组件链修改和添加查询结果、用户查询分析器和插件式功能。
性能增强——显著提高了索引速度,二进制响应格式和快速查询删除功能。
详细的更新日志可以这里获得。
Seeley谈到了更多Solr在伸缩性、功能和实用性方面的细节:
Solr已经部署过数以百万计容量的文档,如果借助分布式搜索,Solr应该能够处理数十亿的文档集合。
Solr基于Lucene,具有优秀的全文相关性,可以很方便的提供词组接近性增强、近期文档增强、编辑增强和基于数字值的专有函数的定制评分机制。
AOL正在使用Solr增强它的频道功能:音乐、橄榄球运动、食谱、参考中心、房地产和汽车都使用这项技术。Solr的搜索功能也应用于Netflix、 Zappos、Gamespot、和Internet Archive。还有很多大客户我目前还不能透漏。
关于Solr的未来计划,Seeley提到了更多的可扩展性、对大集群更方便的配置和管理、基于区域和实时的搜索、重构以使用Spring配置插件。Seeley同时提供了一个邮件列表,在那里他详细讨论了Solr未来、特别是2.0版的计划。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。