1. 编写配置文件
1)编写data-config-comment.xml,此文件用于描述如何查询MySQL数据,如何将数据变换导入索引。
假设有一个数据库叫mooc,其中有个表叫comment,代表学生的评论
其中:
entity对应MySQL数据库表中的一行
query对应全库导入的SQL查询
queryImportQuery 对应增量导入的SQL查询
deltaQuery对应增量导入获取最新修改的行ID,这些ID用于queryImportQuery,SQL的含义中
DATE(updatetime) >= '${dih.last_index_time}' OR DATE(writetime) >= '${dih.last_index_time}
表示comment的更新时间updatetime,或者comment的写入时间writetime比上一次的导入时间$(dih.last_index_time)还大。
<dataConfig> <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/mooc" user="root" password="root"/> <document> <entity name="comment" query="SELECT id, DATE_FORMAT(writetime, '%Y-%m-%dT%TZ') as 'writetime', title from comment" deltaImportQuery="SELECT id, DATE_FORMAT(writetime, '%Y-%m-%dT%TZ') as 'writetime', title from comment where id='${dih.delta.id}'" deltaQuery="SELECT id FROM comment WHERE DATE(updatetime) >= '${dih.last_index_time}' OR DATE(writetime) >= '${dih.last_index_time}'"> <field column="id" name="id"/> <field column="writetime" name="writetime"/> <field column="title" name="title"/> </entity> </document> </dataConfig>
如果field里面有HTML标签,则可以使用<entity transformer="HTMLStripTransformer" 来删除。这使用了Solr DataImportHandler的Transformer工具,可以定义多个链式transformer,彼此之间用逗号隔开。
2)假设要创建一个名为mooc的solr核,在其conf目录中的schema.xml文件中编写fields,加入id,writetime,title,其中text_cn,需要使用我上一则博客写的中文分词插件。
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" /> <field name="writetime" type="tdate" indexed="true" stored="true"/> <field name="title" type="text_cn" indexed="true" stored="true"/>
3) 配置Solr的solrconfig.xml
在D:\libs\solr-4.10.2\example\solr\mooc\conf目录中,创建data-config-comment.xml
在solrconfig.xml中创建数据导入handler用来导入comment表,如下编写,其中的data-config-comment.xml即是第1步写的
<requestHandler name="/dataimportcomment" class="org.apache.solr.handler.dataimport.DataImportHandler"> <lst name="defaults"> <str name="config">data-config-comment.xml</str> </lst> </requestHandler>
2.配置使用到的JAVA库文件
创建D:\libs\solr-4.10.2\example\solr\mooc\lib,拷贝solr-dataimporthandler-4.10.2和mysql-connector-java-5.1.26-bin到此,这两个库用于导入和查询数据库
3.启动Solr
进入solr的example目录
java -jar start.jar
3.导入为索引数据
在浏览器运行如下命令做全库导入,表示将数据,导入到Solr核mooc中
http://localhost:8983/solr/mooc/dataimportcomment?command=full-import&commit=y
如果带clean=false参数,则表示不删除原数据
增量导入
http://localhost:8983/solr/mooc/dataimportcomment?command=delta-import
4.删除索引文件
编写一个XML文件,内容为
<delete><query>*:*</query></delete>
执行命令
java -Durl=http://localhost:8983/solr/mooc/update -jar post.jar delete_docs.xml
5. 查询数据
1)使用Solr的edismax query,查询“的”字,返回ID,title,和writetime,以json格式,可以改成wt=xml,表示使用xml格式,但为了程序处理方便,用json
http://localhost:8983/solr/mooc/select?q=的&wt=json&indent=true&defType=edismax&qf=title&omitHeader=true&fl=id,title,writetime
2)精简的,只查出来ID
http://localhost:8983/solr/mooc/select?q=的&wt=json&defType=edismax&qf=title&omitHeader=true&fl=id
omitHeader=true表示取出数据信息
3)查询日期,使用如下参数
到目前为止:
fq=writetime:[* TO NOW]
从2011年8月19号到2014年8月19号:
fq=writetime:[2011-08-19T11:50:23Z TO 2014-08-19T11:50:23Z]
从2011年8月19号以后:
fq=writetime:[2011-08-19T11:50:23Z TO *]
4)高亮显示关键字
http://localhost:8983/solr/mooc/select?q=好的&wt=json&indent=true&defType=edismax&qf=title&omitHeader=true&fl=id,title,writetime&hl=true
hl=true表示开启高亮显示
6.前端搜索操作流程
前端java script 发请求给后端的servlet,servlet向搜索引擎发出查询请求,返回结果给前端
7.定时增量导入数据
1)先写导入脚本sh_delta_import.sh
#!/bin/sh curl "http://localhost:8983/solr/mooc/dataimportcomment?command=delta-import" curl "http://localhost:8983/solr/mooc/dataimportcomment?command=delta-import"
重复一次,是因为Solr可能会在第一次返回一个警告,再执行一次就导入了。
2)配置/etc/crontab,添加一行,表示每天4点执行
00 04 * * * root /mooc/solr-4.10.2/example/sh_delta_import.sh
3)重启定时程序
/etc/rc.d/init.d/crond restart