搜索引擎Solr,Solr提供了层面搜
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,接下来我们需要把数据库的数据和搜索引擎连接起来,让搜索引擎可以读取数据库的数据
[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中。
[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"/>
如有侵权,请联系我,谢谢! 版权所有:北大青鸟 刘仁贵