什么是solr
solr是基于Lucene的全文搜索服务器,对Lucene进行了扩展优化。
准备工作
首先,去下载以下软件包:
JDK8:jdk-8u60-linux-x64.tar.gz
TOMCAT8:apache-tomcat-8.5.4.zip
SOLR5.5.3:solr-5.5.3.zip
并上传到到linux服务器某个路径下,如下图,我放置在/usr/local/solr目录下:
安装solr:解压solr-5.5.3.zip即可;
安装tomcat、jdk:略,网上资料很多,基本上解压,设置个环境变量就可以;
然后,安装mysql:略,我安装的是Mysql 5.5;
创建数据库及表结构:我创建了一个数据库solrdemo,以及user表,如下图,
updatetime:最后更新时间;
valid:是否有效,0表示已删除的数据,不需要建立索引。
创建一个solr core
至于什么叫做core,我觉得就是一个管理数据的东西,里面有一些配置文件,索引的东西。具体创建步骤如下:
进入solr的bin目录,输入以下命令,启动solr:
./solr start
可看到如下日志:
[root@localhost bin]# ./solr start
Waiting up to 30 seconds to see Solr running on port 8983 [-]
Started Solr server on port 8983 (pid=9951). Happy searching!
然后输入./solr create -c demo命令,创建一个core叫demo;
./solr create -c demo
可看到如下日志:
Copying configuration to new core instance directory:
/usr/local/solr/solr-5.5.3/server/solr/demo
Creating new core 'demo' using command:
http://localhost:8983/solr/admin/cores?action=CREATE&name=demo&instanceDir=demo
{
"responseHeader":{
"status":0,
"QTime":7258},
"core":"demo"}
创建完毕;
关闭solr服务:
输入命令./solr stop -all
./solr stop -all
可看到如下日志:
Sending stop command to Solr running on port 8983 ... waiting 5 seconds to allow Jetty process 9951 to stop gracefully.
在/usr/local/solr/solr-5.5.3/server/solr目录下可以看到我们创建的demo core
部署到tomcat
在tomcat的webapp目录下新建一个文件夹,叫solr;
拷贝/usr/local/solr/solr-5.5.3/server/solr-webapp/webapp目录下的内容到/usr/local/solr/apache-tomcat-8.5.4/webapps/solr目录下;
然后在/usr/local/solr/apache-tomcat-8.5.4/webapps/solr目录下新建一个solrhome文件夹,拷贝/usr/local/solr/solr-5.5.3/server/solr(里面有一个我们刚刚创建好的core,“demo”)目录下的内容到/usr/local/solr/apache-tomcat-8.5.4/webapps/solr/solrhome目录下。
拷贝/usr/local/solr/solr-5.5.3/server/lib/ext目录下的jar包到/usr/local/solr/apache-tomcat-8.5.4/webapps/solr/WEB-INF/lib下;
拷贝/usr/local/solr/solr-5.5.3/dist目录下的solr-dataimporthandler-5.5.3.jar和solr-dataimporthandler-extras-5.5.3.jar到/usr/local/solr/apache-tomcat-8.5.4/webapps/solr/WEB-INF/lib下;
拷贝/usr/local/solr/solr-5.5.3/server/resources目录下的log4j.properties文件到/usr/local/solr/apache-tomcat-8.5.4/webapps/solr/WEB-INF/classes目录,没有classes文件夹的自己创建一个。
修改/usr/local/solr/apache-tomcat-8.5.4/webapps/solr/WEB-INF/web.xml文件内容,添加solr/home的配置信息:
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-value>/usr/local/solr/apache-tomcat-8.5.4/webapps/solr/solrhome</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
修改/usr/local/solr/apache-tomcat-8.5.4/webapps/solr/solrhome/demo/conf/solrconfig.xml文件,将75-85行修改为如下内容,因为我们是拷贝过来的,路径变了,我这里直接用绝对路径。
<lib dir="/usr/local/solr/solr-5.5.3/contrib/extraction/lib" regex=".*\.jar" />
<lib dir="/usr/local/solr/solr-5.5.3/dist/" regex="solr-cell-\d.*\.jar" />
<lib dir="/usr/local/solr/solr-5.5.3/contrib/clustering/lib/" regex=".*\.jar" />
<lib dir="/usr/local/solr/solr-5.5.3/dist/" regex="solr-clustering-\d.*\.jar" />
<lib dir="/usr/local/solr/solr-5.5.3/contrib/langid/lib/" regex=".*\.jar" />
<lib dir="/usr/local/solr/solr-5.5.3/dist/" regex="solr-langid-\d.*\.jar" />
<lib dir="/usr/local/solr/solr-5.5.3/contrib/velocity/lib" regex=".*\.jar" />
<lib dir="/usr/local/solr/solr-5.5.3/dist/" regex="solr-velocity-\d.*\.jar" />
最后,启动tomcat,记得开放8080端口,可以修改/etc/sysconfig/iptables,添加-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT,然后输入service iptables restart重启iptables服务。
接着,浏览器输入http://192.168.229.100:8080/solr/index.html,可以看到我们创建的core demo,如下图:
导入mysql数据库数据,并创建索引
1、下载mysql连接驱动,如mysql-connector-java-5.1.22-bin.jar,拷贝到/usr/local/solr/apache-tomcat-8.5.4/webapps/solr/WEB-INF/lib目录;
2、在/usr/local/solr/apache-tomcat-8.5.4/webapps/solr/solrhome/demo/conf目录下新建一个文件data_config.xml,内容如下:
<dataConfig>
<dataSource name="solrdemo" type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://192.168.229.1:3306/solrdemo" user="root" password="root"/>
<document>
<entity dataSource="solrdemo"
name="user"
query="select id, name, address from user where valid=1 "
deltaImportQuery="select id,name,address from user where ID='${dataimporter.delta.id}'"
deltaQuery="select id from user where updatetime > '${dataimporter.last_index_time}'"
deletedPkQuery="select id from user where valid=0">
<field column="id" name="id"/>
<field column="name" name="name"/>
<field column="address" name="address"/>
</entity>
</document>
</dataConfig>
修改/usr/local/solr/apache-tomcat-8.5.4/webapps/solr/solrhome/demo/conf目录下的managed-schema文件,添加如下两行,id已经有了,不用添加:
<field name="address" type="string" indexed="true" stored="true" required="true"/>
<field name="name" type="string" indexed="true" stored="true" required="true" />
修改/usr/local/solr/apache-tomcat-8.5.4/webapps/solr/solrhome/demo/conf目录下的managed-schema文件,添加如下内容:
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">data-config.xml</str>
</lst>
</requestHandler>
然后,重新启动tomcat,并访问http://192.168.229.100:8080/solr/index.html,选择demo core,打开dataimport标签页,点击execute,更新索引,如下图:
打开query标签页,可以看到我们数据库中的数据,这里我们的参数q为*.*,匹配所有,如下:
定时更新索引
下载apache-solr-dataimportscheduler.jar库,并将其拷贝到/usr/local/solr/apache-tomcat-8.5.4/webapps/solr/WEB-INF/lib目录。
修改/usr/local/solr/apache-tomcat-8.5.4/webapps/solr/WEB-INF/web.xml文件,添加监听器:
<listener>
<listener-class>
org.apache.solr.handler.dataimport.scheduler.ApplicationListener
</listener-class>
</listener>
在/usr/local/solr/apache-tomcat-8.5.4/webapps/solr/solrhome/目录新建一个conf文件夹,并在该文件夹下新建dataimport.properties文件,文件内容如下:
#################################################
# #
# dataimport scheduler properties #
# #
#################################################
# to sync or not to sync
# 1 - active; anything else - inactive
syncEnabled=1
# which cores to schedule
# in a multi-core environment you can decide which cores you want syncronized
# leave empty or comment it out if using single-core deployment
syncCores=demo
# solr server name or IP address
# [defaults to localhost if empty]
server=192.168.229.100
# solr server port
# [defaults to 80 if empty]
port=8080
# application name/context
# [defaults to current ServletContextListener's context (app) name]
webapp=solr
# URL params [mandatory]
# remainder of URL
params=/dataimport?command=delta-import&clean=false&commit=true
# schedule interval
# number of minutes between two runs
# [defaults to 30 if empty]
interval=1
# 重做索引的时间间隔,单位分钟,默认7200,即5天;
# 为空,为0,或者注释掉:表示永不重做索引
reBuildIndexInterval=1440
# 重做索引的参数
reBuildIndexParams=/dataimport?command=full-import&clean=true&commit=true
# 重做索引时间间隔的计时开始时间,第一次真正执行的时间=reBuildIndexBeginTime+reBuildIndexInterval*60*1000;
# 两种格式:2012-04-11 03:10:00 或者 03:10:00,后一种会自动补全日期部分为服务启动时的日期
reBuildIndexBeginTime=03:00:00
这里,我们配置每隔1分钟增量更新索引,每隔一天全量更新索引(每天03:00:00)。
重启tomcat,观察日志,发现每分钟会自动增量更新索引;
也可以自己做个小测试,往数据库插入数据,然后搜索,发现找不到,但是等过了1分钟再次搜索,发现可以找到。
PS:如果启动tomcat报空指针异常,或定时增量更新失败,可以参考如下文章,我自己打的一个jar包,在5.5.3版本下,经测试,定时增量和全量更新索引功能正常。
资源文件
https://github.com/peterchenhdu/Demos/tree/master/solr-in-tomcat
参考:https://cwiki.apache.org/confluence/display/solr/Apache+Solr+Reference+Guide