企业级搜索引擎Solr使用入门指南
2014-08-25 13:48
447 查看
由于搜索引擎功能在门户社区中对提高用户体验有着重在门户社区中涉及大量需要搜索引擎的功能需求,目前在实现搜索引擎的方案上有集中方案可供选择:
基于Lucene自己进行封装实现站内搜索。工作量及扩展性都较大,不采用。
调用Google、Baidu的API实现站内搜索
同第三方搜索引擎绑定太死,无法满足后期业务扩展需要,暂时不采用。
基于Compass+Lucene实现站内搜索
适合于对数据库驱动的应用数据进行索引,尤其是替代传统的like‘%expression%’来实现对varchar或clob等字段的索引,对于实现站内搜索是一种值得采纳的方案。但在分布式处理、接口封装上尚需要自己进行一定程度的封装,暂时不采用。
基于Solr实现站内搜索
封装及扩展性较好,提供了较为完备的解决方案,因此在门户社区中采用此方案,后期加入Compass方案。
1、Solr简介
Solr是一个基于Lucene的Java搜索引擎服务器。Solr提供了层面搜索、命中醒目显示并且支持多种输出格式(包括XML/XSLT和JSON格式)。它易于安装和配置,而且附带了一个基于HTTP的管理界面。Solr已经在众多大型的网站中使用,较为成熟和稳定。Solr包装并扩展了Lucene,所以Solr的基本上沿用了Lucene的相关术语。更重要的是,Solr创建的索引与Lucene搜索引擎库完全兼容。通过对Solr进行适当的配置,某些情况下可能需要进行编码,Solr可以阅读和使用构建到其他Lucene应用程序中的索引。此外,很多Lucene工具(如Nutch、Luke)也可以使用Solr创建的索引。2、Tomcat下Solr安装配置
由于Solr基于java开发,因此Solr在windows及Linux都能较好部署使用,但由于Solr提供了一些用于测试及管理、维护较为方便的shell脚本,因此在生产部署时候建议安装在Linux上,测试时候可以在windows使用。下面以Linux下安装配置Solr进行说明,windows与此类似。
wget
unzipapache-tomcat-6.0.16.zip
mvapache-tomcat-6.0.16/opt/tomcat
chmod755/opt/tomcat/bin/*
wget
tarzxvfapache-solr-1.2.0.tgz
Solr的安装配置最为麻烦的是对solr.solr.home的理解和配置,主要有三种
基于当前路径的方式
cpapache-solr-1.2.0/dist/apache-solr-1.2.0.war/opt/tomcat/webapps/solr.war
mkdir/opt/solr-tomcat
cp-rapache-solr-1.2.0/example/solr//opt/solr-tomcat/
cd/opt/solr-tomcat
/opt/tomcat/bin/startup.sh
由于在此种情况下(没有设定solr.solr.home环境变量或JNDI的情况下),Solr查找./solr,因此在启动时候需要切换到/opt/solr-tomcat
基于环境变量solr.solr.home
在当前用户的环境变量中(.bash_profile)或在/opt/tomcat/catalina.sh中添加如下环境变量
exportJAVA_OPTS="$JAVA_OPTS-Dsolr.solr.home=/opt/solr-tomcat/solr"
基于JNDI配置
mkdir–p/opt/tomcat/conf/Catalina/localhost
touch/opt/tomcat/conf/Catalina/localhost/solr.xml,内容如下:
<ContextdocBase="/opt/tomcat/webapps/solr.war"debug="0"crossContext="true">
<Environmentname="solr/home"type="java.lang.String"value="/opt/solr-tomcat/solr"override="true"/>
</Context>
访问solr管理界面
3、Solr原理
Solr对外提供标准的http接口来实现对数据的索引的增加、删除、修改、查询。在Solr中,用户通过向部署在servlet容器中的SolrWeb应用程序发送HTTP请求来启动索引和搜索。Solr接受请求,确定要使用的适当SolrRequestHandler,然后处理请求。通过HTTP以同样的方式返回响应。默认配置返回Solr的标准XML响应,也可以配置Solr的备用响应格式。
可以向Solr索引servlet传递四个不同的索引请求:
add/update允许向Solr添加文档或更新文档。直到提交后才能搜索到这些添加和更新。
commit告诉Solr,应该使上次提交以来所做的所有更改都可以搜索到。
optimize重构Lucene的文件以改进搜索性能。索引完成后执行一下优化通常比较好。如果更新比较频繁,则应该在使用率较低的时候安排优化。一个索引无需优化也可以正常地运行。优化是一个耗时较多的过程。
delete可以通过id或查询来指定。按id删除将删除具有指定id的文档;按查询删除将删除查询返回的所有文档。
一个典型的Add请求报文
<add>
<doc>
<fieldname="id">TWINX2048-3200PRO</field>
<fieldname="name">CORSAIRXMS2GB(2x1GB)184-PinDDRSDRAMUnbufferedDDR400(PC3200)DualChannelKitSystemMemory-Retail</field>
<fieldname="manu">CorsairMicrosystemsInc.</field>
<fieldname="cat">electronics</field>
<fieldname="cat">memory</field>
<fieldname="features">CASlatency2,2-3-3-6timing,2.75v,unbuffered,heat-spreader</field>
<fieldname="price">185</field>
<fieldname="popularity">5</field>
<fieldname="inStock">true</field>
</doc>
<doc>
<fieldname="id">VS1GB400C3</field>
<fieldname="name">CORSAIRValueSelect1GB184-PinDDRSDRAMUnbufferedDDR400(PC3200)SystemMemory-Retail</field>
<fieldname="manu">CorsairMicrosystemsInc.</field>
<fieldname="cat">electronics</field>
<fieldname="cat">memory</field>
<fieldname="price">74.99</field>
<fieldname="popularity">7</field>
<fieldname="inStock">true</field>
</doc>
</add>
一个典型的搜索结果报文:
<response>
<lstname="responseHeader">
<intname="status">0</int>
<intname="QTime">6</int>
<lstname="params">
<strname="rows">10</str>
<strname="start">0</str>
<strname="fl">*,score</str>
<strname="hl">true</str>
<strname="q">content:"facetedbrowsing"</str>
</lst>
</lst>
<resultname="response"numFound="1"start="0"maxScore="1.058217">
<doc>
<floatname="score">1.058217</float>
<arrname="all">
<str>
<str>SolrisGreat</str>
<str>solr,lucene,enterprise,search,greatness</str>
<str>Solrhassomereallygreatfeatures,likefacetedbrowsing
andreplication</str>
</arr>
<arrname="content">
<str>Solrhassomereallygreatfeatures,likefacetedbrowsing
andreplication</str>
</arr>
<datename="creationDate">2007-01-07T05:04:00.000Z</date>
<arrname="keywords">
<str>solr,lucene,enterprise,search,greatness</str>
</arr>
<intname="rating">8</int>
<strname="title">SolrisGreat</str>
<strname="url">
</doc>
</result>
<lstname="highlighting">
<lstname="
<arrname="content">
<str>Solrhassomereallygreatfeatures,like<em>faceted</em>
<em>browsing</em>andreplication</str>
</arr>
</lst>
</lst>
</response>
关于solr的详细使用说明,请参考
4、Solr测试使用
Solr的安装包包含了相关的测试样例,路径在apache-solr-1.2.0/example/exampledocs使用shell脚本(curl)测试Solr的操作:
cdapache-solr-1.2.0/example/exampledocs
vipost.sh,根据tomcat的ip、port修改URL变量的值URL=http://localhost:8080/solr/update
./post.sh*.xml#
使用Solr的java包测试Solr的操作:
查看帮助:java-jarpost.jar–help
提交测试数据:
java-Durl=http://localhost:8080/solr/update-Ddata=files-jarpost.jar*.xml
下面以增加索引字段liangchuan、url为例,说明一下Solr中索引命令的使用
1)修改solr的schema,配置需要索引字段的说明:
vi/opt/solr-tomcat/solr/conf/schema.xml,在<fields>中增加如下内容
<fieldname="liangchuan"type="string"indexed="true"stored="true"/>
<fieldname="url"type="string"indexed="true"stored="true"/>
2)创建增加索引请求的xml测试文件
touch/root/apache-solr-1.2.0/example/exampledocs/liangchuan.xml,内容如下:
<add>
<doc>
<fieldname="id">liangchuan000</field>
<fieldname="name">Solr,theEnterpriseSearchServer</field>
<fieldname="manu">ApacheSoftwareFoundation</field>
<fieldname="liangchuan">liangchuan'ssolr"hello,world"test</field>
<fieldname="url">
</doc>
</add>
3)提交索引请求
cdapache-solr-1.2.0/example/exampledocs
./post.shliangchuan.xml
4)查询
通过solr的管理员界面
或通过curl测试:
exportURL="http://localhost:8080/solr/select/"
curl"$URL?indent=on&q=liangchuan&fl=*,score"
5、Solr查询条件参数说明
参数 | 描述 | 示例 |
q | Solr中用来搜索的查询。可以通过追加一个分号和已索引且未进行断词的字段的名称来包含排序信息。默认的排序是scoredesc,指按记分降序排序。 | q=myField:JavaANDotherField:developerWorks;dateasc 此查询搜索指定的两个字段并根据一个日期字段对结果进行排序。 |
start | 将初始偏移量指定到结果集中。可用于对结果进行分页。默认值为0。 | start=15 返回从第15个结果开始的结果。 |
rows | 返回文档的最大数目。默认值为10。 | rows=25 |
fq | 提供一个可选的筛选器查询。查询结果被限制为仅搜索筛选器查询返回的结果。筛选过的查询由Solr进行缓存。它们对提高复杂查询的速度非常有用。 | 任何可以用q参数传递的有效查询,排序信息除外。 |
hl | 当hl=true时,在查询响应中醒目显示片段。默认为false。参看醒目显示参数上的SolrWiki部分可以查看更多选项 | hl=true |
fl | 作为逗号分隔的列表指定文档结果中应返回的Field集。默认为“*”,指所有的字段。“score”指还应返回记分。 | *,score |
其中关于Solr查询相关的参数详细的信息请参看:
http://wiki.apache.org/solr/CommonQueryParameters
Solr的查询条件参数q的格式与Lucene相同,具体参看:
6、在门户社区中solr使用模式
在门户社区中需要使用solr,可采用如下模式:对原有系统已有的数据或需要索引的数据量较大的情况
直接采用通过http方式调用solr的接口方式,效率较差,采用solr本身对csv的支持(
),将数据导出为csv格式,然后调用solr的csv接口http://localhost:8080/solr/update/csv
对系统新增的数据
先将需要索引查询的数据组装成xml格式,然后使用httpclient将数据提交到solr的http接口,例如
也可以参考post.jar中的SimplePostTool的实现。
http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/util/SimplePostTool.java?view=co
中文分词
采用庖丁解牛作为solr(Lucene)缺省的中文分词方案
项目库:
Googlegroups:
Javaeye的groups:
与nutch的集成使用
嵌入式Solr
分布式索引