Solr简介:
基于Lucene的java搜索引擎服务器程序
输出多种格式(XML/XSLT和JSON等)建立索引,维护索引
数据检索(全文检索,高亮显示,精确搜索)
Solr下载
下载地址:
https://archive.apache.org/dist/lucene/solr/
solr依赖环境
JDK TOMCAT
Solr的服务器搭建
解压下载的solr的zip包,目录如下 :
将dist\solr-4.9.1.war文件复制到tomcat的webapps目录下,并将文件命名为solr.war :
复制 solr解压包下example\lib\ext 下所有的jar 到tomcat 的lib目录下 :
在计算机本地新建一个文件夹solr_home(当然你可以随便起名字), 然后复制
solr-4.9.1\example\solr 下的所有文件到 solr_home下 :
启动tomcat,待tomcat启动成功后,关闭tomcat。打开tomcat的webapps目录。注意,
此时solr的war包以及被解压成solr文件夹。删除tomcat 的webapps目录下的solr的war
包,保留solr文件夹。
修改配置文件 apache-tomcat-7.0.67\webapps\solr\WEB-INF\web.xml
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-value>E:\solr_home</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
访问solr(http://localhost:端口号/solr/),如出现以下界面则solr部署成功。
新建数据配置 core
新建core(solr中把配置的每一个模块都叫core),在solr_home目录下,拷贝collection1文件夹,并起名为test。打开test文件夹,修改core.properties文件,将name修改为test
重新启动tomcat,并访问solr,如出现以下界面,则表示新建test core成功。
新增数据库配置
到目前为止,我们已经完成了solr的基础配置,并且创建了test core,接下来我们需要把数
据的数据和搜索引擎连接起来,让搜索引擎可以读取数据库的数据。
- 拷贝数据库连接jar包(mysql-connector-java-5.1.18.jar)到tomcat的lib目录
- 以创建test core的方式新建hotel core
- 打开hotel的conf文件夹中的solrconfig.xml文件,在requestHandler name="/select"
class=“solr.SearchHandler”>前面上加上一个dataimport的处理的Handler
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">data-config.xml</str>
</lst>
</requestHandler>
在hotel的的conf文件夹下并新建data-config.xml文件,配置如下
<?xml version="1.0" encoding="UTF-8"?>
<dataConfig>
<dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://127.0.0.1:3306/newsdb" user="root" password="123456" />
<document name="hotel_doc">
<entity name="hotel" pk="id" query="SELECT * FROM news_user">
<field column="id" name="id"/>
<field column="userName" name="userName"/>
<field column="passWord" name="passWord"/>
</entity>
</document>
</dataConfig>
打开hotel的conf目录下的schema.xml文件
(1)保留_version_ 这个field 如下:(删除其它所有field,dynamicField,copyField标签)
保留uniqueKey标签如下:
(2)添加索引字段:这里每个field的name要和data-config.xml里的entity的field的name一样,一一对应。
<field name="_version_" type="long" indexed="true" stored="true"/>
<field name="id" type="string" indexed="true" stored="false"/>
<field name="userName" type="string" indexed="true" stored="false"/>
<field name="passWord" type="string" indexed="true" stored="false"/>
<uniqueKey>id</uniqueKey>
<field name="text" type="text_general" indexed="true" stored="false" multiValued="true"/>
将导入数据的JAR包拷贝到webapps/solr/WEB-INF/lib的lib目录下
启动Tomcat,执行数据导入。
如果报错:
解决:
可能是把solr schema.xml的id设置成了int类型。本身并没有错,但solr启动会扫描cinf目录下的elevate.xml文件,这个文件中定义的id值是MA147LL/A,所以会出现SolrException异常: Invalid Number: MA147LL/A。
打开solr中conf的elevate.xml:
注解掉:
<query text="ipod">
<doc id="MA147LL/A" /> <!-- put the actual ipod at the top -->
<doc id="IW-02" exclude="true" /> <!-- exclude this cable -->
</query>
成功显示的页面:
执行查询操作:
配置增量更新
配置solr的增量更新,即定时将数据库的数据导入到solr中。
将apache-solr-dataimports-cheduler.jar包添加至solr的\solr\WEB-INF\lib目录下
注:apachesolrdataimportscheduler.jar的jar包是apache提供的用于增量更新的jar包,但
apache提供的原jar包中,代码有BUG。该bug在教学资料提供的jar包中已经被修复,具体可参
考提供的apachesolrdataimportscheduler的源码,在此不再赘述。
增加增量更新配置文件,在solr_home文件夹下新建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=test,hotel
# solr server name or IP address
# [defaults to localhost if empty]
server=localhost
# 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=7200
# 重做索引的参数
reBuildIndexParams=/dataimport?command=full-import&clean=true&commit=true
# 重做索引时间间隔的计时开始时间,第一次真正执行的时间=reBuildIndexBeginTime+reBuildIndexInterval*60*1000;
# 两种格式:2012-04-11 03:10:00 或者 03:10:00,后一种会自动补全日期部分为服务启动时的
日期
reBuildIndexBeginTime=03:10:00
新增增量更新数据的监听器,在solr的web.xml中加入以下监听器
<listener>
<listener-class>
org.apache.solr.handler.dataimport.scheduler.ApplicationListener
</listener-class>
</listener>
修改导入数据查询SQL
说明:deltaQuery是根据dataimport.properties配置文件中的更新时间,从数据库中查询出,修
改日期在最后一次更新日期之后的酒店数据,并记录其id,而deltaImportQuery的目的是将
deltaQuery查询出的数据导入到solr中
<?xml version="1.0" encoding="UTF-8"?>
<dataConfig>
<dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://127.0.0.1:3306/newsdb" user="root" password="123456" />
<document name="news">
<entity name="news_user" pk="id" query="SELECT id,userName,passWord FROM news_user"
deltaImportQuery="SELECT id,userName,passWord FROM news_user where id='${dih.delta.id}'"
deltaQuery="SELECT id as id FROM news_user where modifyDate > '${dih.last_index_time}'">
<field column="id" name="id"/>
<field column="userName" name="userName"/>
<field column="passWord" name="passWord"/>
</entity>
</document>
</dataConfig>
启动Tomcat进行测试 :
正常导入,还未修改
数据库修改
原:
修改后:
1分钟后查询数据,确定数据是否更新 成功!!
配置分词器
分词器: 是从用户输入的一段文本中提取关键词,用于其它业务操作
常见的 JAVA 分词器:
word 分词器、
Ansj 分词器、
Stanford 分词器、
IKAnalyzer分词器
我们这里使用:IKAnalyzer 分词器 ,solr 如果是 3.x 版本的用 IKAnalyzer2012_u6.zip 如果是 4.x 版本的用 IK Analyzer 2012FF_hf1.zip,一定要对应上,要不然会配置失败。
IK 分词器下载地址: https://download.csdn.net/download/shangyishang/10803443
百度云网盘:链接: https://pan.baidu.com/s/1H742jeLLZQRh6tYoO-zkTw 提取码: mea3
首先,下载IKAnalyzer 。
将ik的所有jar文件 拷贝到 webapps\solr\WEB-INF\lib 目录下
在webapps\solr\WEB-INF\下新建classes文件夹,将\solr\WEB-INF\lib下的IKAnalyzer.cfg.xml和stopword.dic
文件拷贝到改文件夹下
在 solr_home\test\conf\schema.xml 增加如下配置:
对分词器类型进行配置
<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>
修改solr_home\hotel\conf\schema.xml将userName和passWord指定成为text_ik类型
重启Tomcat,访问solr测试分词器 成功!
Solr查询语法
1.q关键字查询
2.fq对q关键字的过滤查询
3.sort排序 id asc正序 ; id desc倒序
4.start从那个位置开始,rows显示几条数据
5.fl对字段进行过滤;列:只显示id和userName字段:id userName
6.wt数据的返回类型
Solr多字段的匹配
对多个字段进行检索
步骤:在\solr_home\test\conf\schema.xml下新建指定的multiValued=“true”
配置copyField如下:
测试: