一、简介
参考地址
http://lucene.apache.org/solr/
http://martinyuan.iteye.com/blog/441743
http://www.blogjava.net/RongHao/archive/2007/11/06/158621.html
Solr是一个基于Lucene的Java搜索引擎服务器,Solr使用Lucene的搜索核心库来做全文检索,它的接口采用HTTP/XML和JSON APIs传输数据,只需简单配置即可使用,不用像lucene那样还有大量的封装接口,实现搜索和索引代码工作量,并且Solr 创建的索引与 Lucene 搜索引擎库完全兼容,即何时替换都可。
特性有以下几点:
Faceted Search:分面搜索,多维度
Text Analysis:文本解析
Highlighting:高亮
多种输出格式:html,xml,json,csv
数据库集成
具体参见solr演示的example,搜索支持多维度多条件的过滤查询
二、solr使用方式
在别的系统中使用solr,可采用的方式:
· 对大数据量的索引工作可采用csv方式处理
直接采用通过http方式调用solr的接口方式,效率较差,采用solr本身对csv 的支持(http://wiki.apache.org/solr/UpdateCSV),将数据导出为csv格式,然后调用solr的csv接口http://ip:port/solr/update/csv
· 更新索引数据
包含新增、更新、删除,都有对应的指令,需先将需要索引查询的数据组装成xml格式,然后使用httpclient 将数据提交到solr 的http接口,具体可参考solrdemo提供的post.jar中的SimplePostToolTool的实现。
三、配置运行solr实战
参考地址http://lucene.apache.org/solr/api-3_6_1/doc-files/tutorial.html
方案1,使用官方提供的嵌入式jetty启动:
1、进入solr/example目录执行
java -jar start.jar
启动嵌入的jetty,端口为8983, 访问管理页面http://localhost:8983/solr/admin/
2、indexing data,进入solr/example/exampledocs,run "java -jar post.jar" on some of the XML files in thatdirectory,具体执行下面命令,建立示例的索引数据
java -jar post.jar solr.xml monitor.xml
下面这个是建立所有索引数据啦
java -jar post.jar solr.xml *.xml

3、search data啦
搜索结果文本

4、updatedata
Solr/example/solr/conf下的

如图配置了id为唯一关键字,那如果索引了两条id相同的记录,后者会覆盖前者。
5、deleting data,通过类似下面命令删除document
java -Ddata=args -Dcommit=no -jar post.jar "<delete><id>SP2514N</id></delete>"
然后要执行下面命令提交一下,否则还是能搜索到,因为index change has not detected by searcher
java -jar post.jar
方案2,部署到tomcat下:
1.tomcat6.0.18到位,solr包到位
2.拷贝solr/dist下的war包到tomcat应用部署目录下
3. 在%TOMCAT_HOME%\conf\Catalina\localhost下新建solr.xml,配置如下
<ContextdocBase=”war的目录”>
<Environment name="solr/home"type="java.lang.String" value="E:\资源\开源项目\lucene\study\apache-solr-3.6.1\example\solr"override="true" />
</Context>
备注:
Value指定了是solr的主目录,使用solr/example下的solr目录,里面主要有conf和data,conf里面存放配置文件,最重要的就是schema.xml和solrconfig.xml,而data存放索引文件。schema.xml主要包括types、fields和其他的一些缺省设置。solrconfig.xml用来配置Solr的一些系统属性,例如与索引和查询处理有关的一些常见的配置选项,以及缓存、扩展等等。
docBase中的路径可以是相对路径或绝对路径(docBase中可以指定weapps目录下的应用或war文件的路径,默认去tomcat的webapps下查找,如果是相对路径是相对%TOMCAT_HOME%conf/server.xml.中Host元素中appBase属性指定的路径
Environment元素中name属性是指定JNDI的名称,在这里JNDI为java:comp/solr/home,关于JNDI是J2EE规范,所有J2EE容器都会实现,用于寻找组件用。
4.修改tomcat中conf目录下的server.xml文件,在connector 节点中添加 字符编码属性 URIEncoding,如下
<Connectorport="8080" protocol="HTTP/1.1" connectionTimeout="20000"
URIEncoding="UTF-8" redirectPort="8443"/>
5.启动tomcat,在浏览器中输入http://ip:port/solr/admin
如果要检索查询数据,则需先indexing data,solr提供的例子post.jar提交的端口是8983,具体错误如下所示,可以把tomcat应用端口改为8983,然后再indexingdata。

检索成功
配置中文分词组件IKAnalyzer:
1.把IKAnalyzer3.2.8.jar拷贝到solr.war的web-infi/lib目录下
2.IKAnalyzer.cfg.xml和ext_stopword.dic拷贝到solr.war的web-infi/classes目录下,配置扩展字典和扩展停止字典,可选。
3.调整solr主目录conf/schema.xml配置
这里采用IKTokenizerFactory配置,用IKAnalyzer亦可,到了solr4.0版本官方取消了BaseTokenizerFactory,就只能采用IKAnalyzer配置了。
4.启动solr
java -jar start.jar
5.重新post data

6.测试分词效果
打开地址http://localhost:8983/solr/admin/analysis.jsp
根据我之前的schema中text_general的分析器设置,index时采用最细粒度分词方式,query时采用最大词长分词方式。
拿IKAnalyzer官方手册介绍的一个例子来演示:
文本原文1:
IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。
最大词长分词结果:
引用
ikanalyzer| 是 | 一个 | 开源 | 的 | 基于 | java | 语言 | 开发 | 的 | 轻量级 | 的 | 中文 | 分词 | 工具包
最细粒度分词结果:
引用
ikanalyzer| 是 | 一个 | 一 | 个 | 开源 | 的 | 基于 | java | 语言 | 开发 | 的 | 轻量级 | 量级 | 的 | 中文 | 分词 | 工具包 | 工具
我们设置analyzer页面具体参数之后执行analyze,结果如下图所示,完全符合上述的例子,故到此为止solr3.6.1配置IKAnalyzer3.2.8中文分词器成功。

四、后续待补充:
1.solr的schema配置还有待详细了解
官方参考手册http://wiki.apache.org/solr/SchemaXml
这篇中文介绍的不错http://www.blogjava.net/conans/articles/379545.html
2.solr与数据库集成 DataImportHandler
http://hi.baidu.com/chuanliang2007/item/850ab1ebde54ad11585dd885
还有一些别的有意思的资料:
Solr使用搜索论坛示例
http://blog.chenlb.com/2009/05/apache-solr-quick-start-and-demo.html
solr4智能提示http://www.iteye.com/topic/1126961
solr4打分规则http://www.iteye.com/topic/1126944
五、问题和注意点:
1、出于jdk5的考虑只能使用ikanalyzer3.2.8版本,2012版都要求jdk6+,不知该版本是否支持solr3.6.1?
2、ikanalyzer与solr结合使用的两种配置方式,采用IKAnalyzer配置如果设置才能类似iktokenizerFactory那样设置索引采用最细粒度切词方式,查询采用最长词长切词方式
因为solr4.0版本如您手册所说取消了basetokenizerfactory,只能采用ikanalyzer配置,那样是否就达不到我想要的效果了。
3. 关于中文,solr内核支持UTF-8编码,所以在tomcat里的server.xml需要进行配置
<Connector port="8080" maxHttpHeaderSize="8192" URIEncoding="UTF-8" …/>
另外,向solr Post请求的时候需要转为utf-8编码。对solr 返回的查询结果也需要进行一次utf-8的转码。检索数据时对查询的关键字也需要转码,然后用“+”连接。
具体参见SimplePostTool