项目中使用的搜索引擎的模块,之前是其他同事开发的,感觉有点小缺陷,需要人工去录入索引,更新,重做索引等!于是自己动手搭建了套,找了相关资料,折腾了下。在这里总结记录下来,一是给自己加深印象 二是给需要帮助的朋友提供一个参考!
一 介绍
Apache Solr (读音: SOLer) 是一个开源的搜索服务器。Solr 使用 Java 语言开发,主要基于 HTTP 和 Apache Lucene 实现。Apache Solr 中存储的资源是以 Document 为对象进行存储的。每个文档由一系列的 Field 构成,每个 Field 表示资源的一个属性。Solr 中的每个 Document 需要有能唯一标识其自身的属性,默认情况下这个属性的名字是 id,在 Schema 配置文件中使用:<uniqueKey>id</uniqueKey>
进行描述。
Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器。文档通过Http利用XML加到一个搜索集合中。查询该集合也是通过 http收到一个XML/JSON响应来实现。它的主要特性包括:高效、灵活的缓存功能,垂直搜索功能,高亮显示搜索结果,通过索引复制来提高可用性,提 供一套强大Data Schema来定义字段,类型和设置文本分析,提供基于Web的管理界面等。
二 下载:
http://mirror.bit.edu.cn/apache/lucene/solr/4.2.0/
我下载的版本是:solr-4.2.0.tgz 111MB
打开目录结构:
三 部署:
linux 服务器 tomcat 路径: /usr/local/tomcat_solr
1、将 solr-4.2.0\example 下的 solr 打包放到 /usr/local/tomcat_solr
2、将 solr-4.2.0\dist 下的solr-4.2.0.war 改名为 solr.war 放到 /usr/local/tomcat_solr/webapps
3、 进入/usr/local/tomcat_solr/conf/Catalina/localhost目录,创建solr.xml 内容如下:
<Context docBase="/usr/local/tomcat_solr/webapps/solr.war" debug="0" crossContext="true">
<Environment name="solr/home" type="java.lang.String" value="/usr/local/tomcat_solr/solr" override="true" />
</Context>
4、重启tomcat_solr 输入:
http://localhost:8080/solr/ 出现如下界面,ok,证明你配置成功了。
四 根据项目需要配置solr。
添加索引,solr 有2种录入索引的方式,我这里介绍通过dataimport 自动录入索引。
cd /usr/local/tomcat_solr/solr/collection1/conf
1、打开,solrconfig.xml 在<config> 节点下增加:
<requestHandler name = "/dataimport" class = "org.apache.solr.handler.dataimport.DataImportHandler" >
<lst name="defaults">
<str name="config">data-config.xml</str>
</lst>
</requestHandler>
2、注意,刚copy过去目录中是没有 dataimport相关jar包的,没给打包到项目中,我在配置的时候就漏掉了,启动时报 找不到class,
将:solr-4.2.0\dist 下的:solr-dataimporthandler-4.2.0.jar solr-dataimporthandler-extras-4.2.0.jar 由于我用的是mysql数据,还需要找一个mysql驱动
mysql-connector-java-5.1.15-bin.jar 一起放到 /usr/local/tomcat_solr/webapps/solr/WEB-INF/lib
3、第一步中配置引用了 data-config.xml ,在/usr/local/tomcat_solr/solr/collection1/conf 下创建data-config.xml 内容如下:
<dataConfig>
<dataSource type="JdbcDataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/cms"
user="root"
password="root"/>
<document>
<entity name="movie" pk="id"
query="select m.id,name,director,protagonist,genre,mold,area,years,imageUrl,pinyin from t_ever_movie m , t_ever_movie_url u where m.status=1 and u.status=1 and u.movie_id=m.id and deleteDate is null "
deltaImportQuery="select m.id,name,director,protagonist,genre,mold,area,years,imageUrl,pinyin from t_ever_movie m , t_ever_movie_url u where m.status=1 and u.status=1 and u.movie_id=m.id and deleteDate is null and m.id='${dataimporter.delta.id}'"
deltaQuery="select m.id,name,director,protagonist,genre,mold,area,years,imageUrl,pinyin from t_ever_movie m , t_ever_movie_url u where m.status=1 and u.status=1 and u.movie_id=m.id and deleteDate is null and enteringDate>'${dataimporter.last_index_time}'"
>
<field column="id" name="id"/>
<field column="name" name="name"/>
<field column="director" name="director"/>
<field column="protagonist" name="protagonist"/>
<field column="genre" name="genre"/>
<field column="mold" name="mold"/>
<field column="area" name="area"/>
<field column="years" name="years"/>
<field column="imageUrl" name="imageUrl"/>
<field column="pinyin" name="pinyin"/>
<entity name="inner"
query="select providerCode from t_ever_movie_url where movie_id ='${movie.id}' and status=1 group by providerCode">
<field column="providerCode" name="providerCode"/>
</entity>
</entity>
</document>
</dataConfig>
参数说明:
dataSource 应该都不用说,知道是配置的什么吧!
entity 下面配置的是需要录入索引的数据,solr提供了多表联合查询的操作。
${movie.id} 就是t_ever_movie 中的参数。
providerCode 会有多个,在配置schema.xml 的时候需要设置为 multiValued="true"
4、配置schema.xml。
a、下载分词jar:
https://code.google.com/p/ik-analyzer/downloads/detail?name=IK%20Analyzer%202012FF_hf1.zip&can=2&q=
将 IKAnalyzer.cfg.xml,IKAnalyzer2012FF_u1.jar,stopword.dic 拷贝到 /usr/local/tomcat_solr/webapps/solr/WEB-INF/lib下面
在schema.xml 的schema 节点下的types 节点中加入分词:
<fieldType name="text_ik" class="solr.TextField">
<analyzer type="index" isMaxWordLength="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
<analyzer type="query" isMaxWordLength="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/> </fieldType>
b、配置fields,在fields 节点下配置:
<field name="name" type="text_general" indexed="true" stored="true"/>
<field name="director" type="text_general" indexed="true" stored="true"/>
<field name="protagonist" type="text_general" indexed="true" stored="true"/>
<field name="genre" type="text_general" indexed="true" stored="true"/>
<field name="mold" type="text_general" indexed="true" stored="true"/>
<field name="area" type="text_general" indexed="true" stored="true"/>
<field name="years" type="text_general" indexed="true" stored="true"/>
<field name="providerCode" type="text_general" indexed="true" stored="true" multiValued="true"/>
c、配置copyField 在 uniqueKey 属性下面配置:
<copyField source="name" dest="text"/> <copyField source="director" dest="text"/> <copyField source="protagonist" dest="text"/> <copyField source="genre" dest="text"/> <copyField source="mold" dest="text"/> <copyField source="area" dest="text"/> <copyField source="years" dest="text"/> <copyField source="providerCode" dest="text"/>
ok,到这里配置基本上已经完成! 注意查看日志。重启tomcat_solr
访问http://localhost:8080/solr/dataimport?command=full-import将数据全部导入solr服务器进行索引
http://localhost:8080/solr/dataimport?command=delta-import增量导入数据
http://localhost:8080/solr/dataimport?command=status可以查看运行状态
当修改data-config.xml文件配置时http://localhost:8080/solr/dataimport?command=reload-config可以进行重新加载配置文件
最后,也是我比较喜欢的可以定时更新 和重录索引。
crontab -e
*/1 * * * * curl http://localhsot:8080/solr/dataimport?command=delta-import > /tmp/solr.tmp 2>&1
录入索引后,监视、记录和统计数据
用于监视、记录和统计数据的 Solr 管理选项
菜单名 | URL | 描述 |
Statistics | Statistics 管理页提供了与 Solr 性能相关的很多有用的统计数据。这些数据包括: 关于何时加载索引以及索引中有多少文档的信息。 关于用来服务查询的 SolrRequestHandler 的有用信息。 涵盖索引过程的数据,包括添加、删除、提交等的数量。 缓存实现和 hit/miss/eviction 信息 | |
Info | 有关正在运行的 Solr 的版本以及在当前实现中进行查询、更新和缓存所使用的类的详细信息。此外,还包括文件存于 Solr subversion 存储库的何处的信息以及对该文件功能的一个简要描述。 | |
Distribution | 显示与索引发布和复制有关的信息。更多信息,请参见 “发布和复制” 一节。 | |
Ping | 向服务器发出 ping 请求,包括在 solrconfig.xml 文件的 admin 部分定义的请求。 | |
Logging | 让您可以动态更改当前应用程序的日志记录等级。更改日志记录等级对于调试在执行过程中可能出现的问题非常有用。 | |
properties | http: //localhost:8080/solr/admin/get-properties.jsp | 显示当前系统正在使用的所有 Java 系统属性。Solr 支持通过命令行的系统属性替换。有关实现此特性的更多信息,请参见 solrconfig.xml 文件。 |
Thread dump | http://localhost:8080/solr/admin/threaddump.jsp | thread dump 选项显示了在 JVM 中运行的所有线程的堆栈跟踪信息。 |
常用
q - 查询字符串,必须的。
fl - 指定返回那些字段内容,用逗号或空格分隔多个。
start - 返回第一条记录在完整找到结果中的偏移位置,0开始,一般分页用。
rows - 指定返回结果最多有多少条记录,配合start来实现分页。
sort - 排序,格式:sort=<field name>+<desc|asc>[,<field name>+<desc|asc>]… 。示例:(inStock desc, price asc)表示先 “inStock” 降序, 再 “price” 升序,默认是相关性降序。
wt - (writer type)指定输出格式,可以有 xml, json, php, phps, 后面 solr 1.3增加的,要用通知我们,因为默认没有打开。
fq - (filter query)过虑查询,作用:在q查询符合结果中同时是fq查询符合的,例如:q=mm&fq=date_time:[20081001 TO 20091031],找关键字mm,并且date_time是20081001到20091031之间的。官方文档:http://wiki.apache.org/solr/CommonQueryParameters
不常用
q.op - 覆盖schema.xml的defaultOperator(有空格时用"AND"还是用"OR"操作逻辑),一般默认指定
df - 默认的查询字段,一般默认指定
qt - (query type)指定那个类型来处理查询请求,一般不用指定,默认是standard。
其它
indent - 返回的结果是否缩进,默认关闭,用 indent=true|on 开启,一般调试json,php,phps,ruby输出才有必要用这个参数。
version - 查询语法的版本,建议不使用它,由服务器指定默认值。
[Solr的检索运算符]
“:” 指定字段查指定值,如返回所有值*:*²
“?”²表示单个任意字符的通配
“*” 表示多个任意字符的通配(不能在检索的项开始使用*或者?符号)²
“~”²表示模糊检索,如检索拼写类似于”roam”的项这样写:roam~将找到形如foam和roams的单词;roam~0.8,检索返回相似度在0.8以上的记录。
²邻近检索,如检索相隔10个单词的”apache”和”jakarta”,”jakarta apache”~10
“^”²控制相关度检索,如检索jakarta apache,同时希望去让”jakarta”的相关度更加好,那么在其后加上”^”符号和增量值,即jakarta^4 apache
布尔操作符AND、||²
布尔操作符OR、²&&
布尔操作符NOT、!、-²(排除操作符不能单独与项使用构成查询)
“+” 存在操作符,要求符号”+”后的项必须在文档相应的域中存在²
( ) 用于构成子查询²
² [] 包含范围检索,如检索某时间段记录,包含头尾,date:[200707 TO 200710]
{}²不包含范围检索,如检索某时间段记录,不包含头尾
date:{200707 TO 200710}
" 转义操作符,特殊字符包括+ -² && || ! ( ) { } [ ] ^ ” ~ * ? : "