1. solr简介
1.1 官网介绍
Solr是一个基于Lucene的Java搜索引擎服务器。Solr提供了层面搜索、命中醒目显示并且支持多种输出格式(包括XML/XSLT和 JSON格式)。
它易于安装和配置,而且附带了一个基于HTTP的管理界面。
Solr已经在众多大型的网站中使用,较为成熟和稳定。Solr包装并扩展了Lucene,所以Solr的基本上沿用了Lucene的相关术语。
更重要的是,Solr 创建的索引与Lucene搜索引擎库完全兼容。
通过对Solr进行适当的配置,某些情况下可能需要进行编码,Solr可以阅读和使用构建到其他 Lucene应用程序中的索引。
此外,很多Lucene工具(如Nutch、Luke)也可以使用 Solr创建的索引。
总结一下solr是一个java搜索引擎服务器(是一套war程序),内部集成了Lucene(apache提供的一些对搜索引擎做支持的jar包).
1.2 什么是Solr
Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。
Solr可以独立运行,运行在Jetty、Tomcat等这些Servlet容器中,Solr 索引的实现方法很简单,用 POST 方法向 Solr 服务器发送一个描述 Field 及其内容的 XML 文档,Solr根据xml文档添加、删除、更新索引 。Solr 搜索只需要发送 HTTP GET 请求,然后对 Solr 返回Xml、json等格式的查询结果进行解析,组织页面布局。Solr不提供构建UI的功能,Solr提供了一个管理界面,通过管理界面可以查询Solr的配置和运行情况。
1.3 solr功能
- 保存数据
- 建立索引,维护索引
- 数据检索(全文检索、高亮检索、精确搜索等)
1.4 solr 依赖环境
- jdk 1.7+
- tomcat7+
- Solr4.10.3
1.5 下载
从Solr官方网站(http://lucene.apache.org/solr/ )下载Solr4.10.3,根据Solr的运行环境,Linux下需要下载lucene-4.10.3.tgz,windows下需要下载lucene-4.10.3.zip。
Solr使用指南可参考:https://wiki.apache.org/solr/FrontPage。
下载lucene-4.10.3.zip并解压:目录介绍如下:
- bin:solr的运行脚本
- contrib:solr的一些贡献软件/插件,用于增强solr的功能。
- dist:该目录包含build过程中产生的war和jar文件,以及相关的依赖文件。
- docs:solr的API文档
- example:solr工程的例子目录:
- example/solr:
该目录是一个包含了默认配置信息的Solr的Core目录。 - example/multicore:
该目录包含了在Solr的multicore中设置的多个Core目录。 - example/webapps:
该目录中包括一个solr.war,该war可作为solr的运行实例工程。
licenses:solr相关的一些许可信息
2. Solr的安装及配置
2.1 3.2.Solr整合tomcat
#1.说明:我的所有软件都是安装在/usr/local/install目录中
mkdir -p /usr/local/install
#2.将solr-4.10.3.tgz.tgz包使用工具上传至Linux的/usr/local/install目录中
#3.进入/usr/local/install目录中
[root@localhost ~] cd /usr/local/install/
#4.解压solr-4.10.3.tgz.tgz
[root@localhost ~] tar –zxf solr-4.10.3.tgz.tgz
#5.将dist\solr-4.10.3.war拷贝到Tomcat的webapp目录下改名为solr.war
[root@localhost ~] solr-4.10.3/dist/solr-4.10.3.war tomcat-#8.5/webapps/solr.war
#6.启动tomcat后,solr.war自动解压,将原来的solr.war删除。
[root@localhost ~] ./tomcat-8.5/bin/startup.sh
#7.拷贝example\lib\ext 目录下所有jar包到Tomcat的webapp\solr\WEB-INF\lib目录下
[root@localhost ~] cp solr-4.10.3/example/lib/ext/*.jar tomcat-8.5/webapps/solr/WEB-INF/lib/
#8.拷贝log4j.properties文件
#在Tomcat下webapps\solr\WEB-INF目录中创建文件 classes文件夹,
[root@localhost ~] mkdir tomcat-8.5/webapps/solr/WEB-INF/classes
#复制Solr目录下example\resources\log4j.properties至Tomcat下webapps\solr\WEB-INF\classes目录
[root@localhost ~] cp solr-4.10.3/example/resources/log4j.properties tomcat-8.5/webapps/solr/WEB-INF/classes/
#9.创建solr_home及配置solrcore的solrconfig.xml文件
#创建solr_home
[root@localhost ~] mkdir solr_home
#example\solr文件夹下的内容复制到solr_home文件夹下
[root@localhost ~] cp -rf solr-4.10.3/example/solr/* solr_home/
<!--10.修改Tomcat目录 下webapp\solr\WEB-INF\web.xml文件,如下所示:
设置Solr home-->
<!--配置jndi告诉solr工程我们的solrhome的位置-->
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-value>/usr/local/install/solr_home</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
#11.停止Tomcat,之后重启
[root@localhost ~] ./tomcat-8.5/bin/shutdown.sh
[root@localhost ~] ./tomcat-8.5/bin/startup.sh
#12.开发Tomcat端口
[root@localhost ~] firewall-cmd --zone=public --add-port=8080/tcp --permanent
[root@localhost ~] systemctl restart firewalld.service
#13.访问solr
http://192.168.0.201:8080/solr
3.Solr界面功能
4. 新建数据配置core
4.1.新建core(colr把配置的每一个模块都叫core),在solr_home目录下,拷贝collection1文件夹,并改名为hotel。打开hotel文件夹,修改core.properties文件将name修改为hotel
[root@localhost install] cp -rf solr_home/collection1 solr_home/hotel
[root@localhost install] vim solr_home/hotel/core.properties
4.2.重新启动Tomcat,并访问solr,入出现如下界面,则表示新建成功hotel core成功
[root@localhost install] ./tomcat-8.5/bin/shutdown.sh
[root@localhost install] ./tomcat-8.5/bin/startup.sh
5. 新增数据库配置
到目前为止,我们已经完成了solr的基础配置,并且创建了hotel core,接下来我们需要把数据库的数据和搜索引擎连接起来,让搜索引擎可以读取数据库的数据
- 拷贝数据库连接jar(mysql-connector-java-5.1.18.jar)到Tomcat的lib目录下
- 打开hotel的conf文件夹中的solrconfig.xml文件,在requestHandler name=”/select” class=”solr.SearchHandler”>前面加上一个dataimport的处理器
[root@localhost install] vim solr_home/hotel/conf/solrconfig.xml
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">data-config.xml</str>
</lst>
</requestHandler>
- 禁用搜索排行:修改solr_home/hotel/conf/solrconfig.xml的配置
[root@localhost install] vim solr_home/hotel/conf/solrconfig.xml
将以下内容注释掉
<searchComponent name="elevator" class="solr.QueryElevationComponent" >
<!-- pick a fieldType to analyze queries -->
<str name="queryFieldType">string</str>
<str name="config-file">elevate.xml</str>
</searchComponent>
- 在hotel的conf文件加下新建data-config.xml文件,配置如下
<?xml version="1.0" encoding="UTF-8"?>
<dataConfig>
<dataSource type="JdbcDataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://192.168.1.106:3306/itrip_db"
user="root"
password="root"/>
<document name="hotel_doc">
<entity name="hotel" pk="id" query="select id,hotelName,address from itrip_hotel">
<field column="id" name="id"/>
<field column="hotelName" name="hotelName"/>
<field column="address" name="address"/>
</entity>
</document>
</dataConfig>
- dataSource是数据库数据源
- Entity就是一张表对应的实体,pk是主键,query是查询语句
- Field对应一个字段,column是数据库的column名,后面的name属性对应着Solr的Field的名字。
- 打开hotel的conf目录下的schema.xml文件
1)保留_version_这个field
2)添加索引字段:这里每个field的name要和data-config.xml里的entity的field的name一样,一一对应
3)删除多余的field,保留_version_和text这两个field(注意不要删除fieldType)
4)添加索引字段:这里每个field的name要和data-config.xml里的entity的field的name一样,红色部分为新增内容
[root@localhost install] vim solr_home/hotel/conf/schema.xml
<field name="_version_" type="long" indexed="true" stored="true"/>
<field name="id" type="long" indexed="true" stored="true" />
<field name="hotelName" type="string" indexed="true" stored="true" />
<field name="address" type="string" indexed="true" stored="true"/>
<field name="text" type="text_general" indexed="true" stored="false" multiValued="true"/>
<uniqueKey>id</uniqueKey>
5)将改文件中所有的<copyFiled>标签删除
- 将solr-4.10.3/dist/导入数据的jar包拷贝到webapps/solr的lib目录下
[root@localhost install] cp solr-4.10.3/dist/solr-dataimporthandler-4.10.3.jar tomcat-8.5/webapps/solr/WEB-INF/lib/
[root@localhost install] cp solr-4.10.3/dist/solr-dataimporthandler-extras-4.10.3.jar tomcat-8.5/webapps/solr/WEB-INF/lib/
- 启动Tomcat,执行数据导入
- 查询数据
6. 增量更新
以上的步骤我们实现了如何将数据库的数据导入到solr中,接下来需要配置solr的增量更新,即定时将数据库的数据导入到solr中。
- 将资料中提供的 apache-solr-dataimports-cheduler jar包添加至solr的目录下
- 将资料中提供的 apache-solr-dataimports-cheduler jar包添加至solr的lib目录下。
- 增加增量更新配置文件,在 solr_home文件夹下新建conf文件夹,并新建名为
dataimport.properties的配置文件,配置如下标红的地方为需要修改的地方
[root@localhost install] mkdir solr_home/conf
[root@localhost install] vim solr_home/conf/dataimpirt.properties
文件内容如下:
#################################################
# #
# dataimport scheduler properties #
# #
#################################################
# to sync or not to sync
# 1-active;anything else-inactive
syncEnabled=1
# which scores 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=hotel,ticket
# 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
# [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中加入以下监听器
[root@localhost install] vim tomcat-8.5/webapps/solr/WEB-INF/web.xml
<listener>
<listener-class>
org.apache.solr.handler.dataimport.scheduler.ApplicationListener
</listener-class>
</listener>
- 修改导入数据的查询语句SQL
<?xml version="1.0" encoding="UTF-8"?>
<dataConfig>
<dataSource type="JdbcDataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://192.168.1.106:3306/itrip_db"
user="root"
password="root"/>
<document name="hotel_doc">
<entity name="hotel" pk="id"
query="select id,hotelName,address from itrip_hotel"
deltaImportQuery="select id,hotelName,address from itrip_hotel where id='${dih.delta.id}'"
deltaQuery="select id as id from itrip_hotel where modifyDate>'${dih.last_index_time}'">
<field column="id" name="id"/>
<field column="hotelName" name="hotelName"/>
<field column="address" name="address"/>
</entity>
</document>
</dataConfig>
说明:deltaQuery是根据dataimport.properties配置文件中的更新时间,从数据库中查询数据,修改日期在最后一次更新日期之后的酒店数据,并记录其id,而deltaImportQuery的目的是将deltaQuery查询出的数据导入到solr中。
- 启动Tomcat进行测试
a)启动Tomcat,访问hotel模块
b)修改数据库中的酒店数据并同时修改数据的modifyDate时间
c)1分钟后查询酒店数据,确定数据是否更新
7.安装中文分词器
- 分词器:是从用户输入的一段文本中提取关键词,用于其他业务操作。
- 常见的java分词器:word分词器、Ansj分词器、Stanford分词器、IK Analyzer分词器
- 分词器:IK Analyzer分词器
- Solr如果是3.x版本的用IK Analyzer2012_u6.zip 如果是4.x版本的用IK Analyzer2012FF_hf.zip,一定要对应上,要不然会配置失败。
- K分词器下载地址:
https://search.gitee.com/?skin=rec&type=repository&q=IK%20Analyzer&repo=&reponame=&pageno=1
7.1安装步骤
7.1.1.第一步:配置IKAnalyzer的jar包
将IKAnalyzer2012FF_u1.jar拷贝到 Tomcat的webapps/solr/WEB-INF/lib 下。
7.1.2.第二步:IKAnalyzer的配置文件
在Tomcat的webapps/solr/WEB-INF/下创建classes目录
[root@localhost install] mkdir tomcat-8.5/webapps/solr/WEB-INF/classes
将IKAnalyzer.cfg.xml、ext_stopword.dic mydict.dic copy到 Tomcat的
webapps/solr/WEB-INF/classes
注意:ext_stopword.dic 和mydict.dic必须保存成无BOM的utf-8类型
7.1.3.第三步:修改schema.xml文件
修改schema.xml文件
修改solr_home\hotel\conf\schema.xml的schema.xml文件,添加FieldType:
[root@localhost install]# vim solr_home/hotel/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>
7.1.4.第四步:设置业务系统Field
设置业务系统Field
[root@localhost install]# vim solr_home/hotel/conf/schema.xml
修改的内容如下:
<field name="hotelName" type="text_ik" indexed="true" stored="true"/>
<field name="address" type="text_ik" indexed="true" stored="true"/>
如有侵权,请联系我,谢谢!
版权所有:北大青鸟 刘仁贵