第一步:Solr下载
官网:https://lucene.apache.org/solr/
solr包下载,里面有solr-7.7.3包和中文分词器、定时更新索引的包
第二步:solr配置
2.1、配置solr与tomcat整合:
官网下载一个tomcat:
官网:http://tomcat.apache.org
下载:apache-tomcat-9.0.43
jdk:1.8
将下载好的solr7.7.3解压缩
1、solr-7.7.3\server\solr-webapp\
路径下的webapp
改名为solr
后拷贝到apache-tomcat-9.0.43\webapps\
路径下
2、将solr-7.7.3\server\lib\ext
和solr-7.7.3\server\lib
路径下的所有jar包拷贝到apache-tomcat-9.0.43\webapps\solr\WEB-INF\lib
下,有相同的包直接覆盖
2.2:配置solr的家目录
1、选一个目录存放solr
的home
目录我的建立在和tomcat
存放目录的同级,新建一个solrhome
文件夹作为solr
的home
目录,由于我tomcat
放在E盘,我solrhome
文件夹也放在E盘了
2、将solr-7.7.3\server\solr
目录下的所有文件及文件夹拷贝到solrhome
文件夹中,在将solr-7.7.3
目录下的contrib
和dist
两个文件夹复制到solrhome
中
3、在solrhome
里面在建一个logs
文件夹用来存放日志,最终solrhome
:
2.3、配置日志路径
1、在apache-tomcat-9.0.43\webapps\solr\WEB-INF
目录下建立一个classes
文件夹用于存放log4j
的配置文件记录日志
2、复制solr-7.7.3\server\resources
目录下的log4j2.xml
配置文件到apache-tomcat-9.0.43\webapps\solr\WEB-INF\classes
下
然后打开log4j2.xml
配置日志的存放路径:
2.4:修改配置web.xml
1、在tomcat
的solr
工程文件夹的web.xml
中即apache-tomcat-9.0.43\webapps\solr\WEB-INF
下的web.xml
中声明solrhome
的位置:增加一行如下:
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<!-- 写自己创建的solrhome的位置-->
<env-entry-value>E:/solrhome</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
然后注释掉web.xml
中的如下配置:
<!-- Get rid of error message -->
<!--
<security-constraint>
<web-resource-collection>
<web-resource-name>Disable TRACE</web-resource-name>
<url-pattern>/</url-pattern>
<http-method>TRACE</http-method>
</web-resource-collection>
<auth-constraint/>
</security-constraint>
<security-constraint>
<web-resource-collection>
<web-resource-name>Enable everything but TRACE</web-resource-name>
<url-pattern>/</url-pattern>
<http-method-omission>TRACE</http-method-omission>
</web-resource-collection>
</security-constraint>
-->
结果如图:
到这里solr配置就结束了,然后启动tomcat服务器访问
http://localhost:8080/solr/index.html
如果访问404的话:有可能没有将solr-7.7.3\server\lib\ext
和solr-7.7.3\server\lib
路径下的所有jar包拷贝到apache-tomcat-9.0.43\webapps\solr\WEB-INF\lib
下
第三步:solr创建Core
solr
的Core
就是Solr
存放数据或者说是索引的地方,本质是一个文件夹,位置在solr
的home
目录下。
在solr管理首页点击Core Admin
点击Add Core
,我们认为会在core home
路径下,创建了一个名为coreTest
的文件夹并完成core的创建,然而并不是。(下图我将名字改成collection1了)
报错了,报E:\solrhome\Colltion1
’中找不到资源‘solrconfig.xml
’
找到solrhome
文件夹在里面会发现只有collection1
文件夹是一个空的,core
并未成功创建,因为我们缺少solrconfig.xml
,
将之前复制到solrhome
中的solrhome\configsets\_default
文件夹 下的conf
文件夹复制到collection1
文件夹下,再次回到首页点击Add Core
就创建成功了。
点击Core Selector
可以选择创建的Core
查看具体信息
第四步:配置IK中文分词器
1、Managed-schema介绍
Managed-schema
,在Solr
创建的Core
的conf
目录下如:solrhome\collection1\conf
,它是Solr数据表配置文件,它定义了加入索引的数据的数据类型的。主要包括Fieldlypes
、Fields
和其他的一些缺省设置。
2、安装IK中文分词器
第一步:把IK-Analyzer-7.2.1.jar
添加到apache-tomcat-9.0.43\webapps\solr\WEB-INF\lib
目录下。
第二步:复制IKAnalyzer
的配置文件IKAnalyzer.cfg.xml
和自定义词典ext.dic
和停用词词典stopword.dic
到apache-tomcat-9.0.43\webapps\solr\WEB-INF\classes
下。这一步是用来配置自定义分词和自定义停词的,一些专有名词,我们希望它能够作为独立的词条,这叫做扩展词;一些助词,谓词我们不希望它被作为词条,这叫停词。
在IKAnalyzer.cfg.xml配置文件里面配置如下信息:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典 -->
<entry key="ext_dict">ext.dic;</entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords">stopword.dic;</entry>
</properties>
示例:
stopword.dic
扩展词文件中加入“而且”词条之前:
ik分词器将“善良而且坚强”分词为 “善良”,“而且”,“坚强”三个词条,
加入之后:
ik分词器将“善良而且坚强”分词为 “善良”,“坚强”两个词条,
ext.dic
扩展词文件中加入“牛二瓦”词条之前,
ik分词器将“牛二瓦”分词为 “牛”,“二”,“瓦”三个词条,
加入之后,
ik分词器将“牛二瓦”分词为 “牛二瓦”,“二”,“瓦”三个词条(如果不想,二和瓦这两个字,就将这两个字加入到stopword.dic中),
第三步:配置Core
的managed-schema
文件,目录solorhome\collection1\conf
<!--ik分词器配置-->
<fieldType name="text_ik" class="solr.TextField">
<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
<field name="content_ik" type="text_ik" indexed="true" stored="false"/>
保存,重启tomcat
就可以使用IK
分词器了
在solr
管理页面选择核然后选择analysis
就可以查看分词效果了
第五步:连接数据库导入数据
使用dataimport
插件批量导入数据。
1、把dataimport
插件依赖的jar
包添加到solrcore
中,路径:collection1\lib
(没有lib文件夹需要创建一个)。
还需要连接mysql
数据库所以导入mysql的驱动包mysql-connector-java-8.0.11.jar
结果下图所示:
2、配置核的核心配置文件solrconfig.xml
(目录:solrhome\collection1\conf
),在其中添加一个requestHandler
<!-- 配置导入数据的requestHandler -->
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">data-config.xml</str>
</lst>
</requestHandler>
配置中涉及到data-config.xml
配置文件用于存放数据库连接信息,在solrconfig.xml
同级目录下创建一个data-config.xml
然后配置data-config.xml
,我这边连接的是我本地数据库,user和password是数据库账号和密码,我这边用到的sql
<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
<dataSource type="JdbcDataSource" driver="com.mysql.cj.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/demo?serverTimezone=UTC" user="root" password="root" />
<document>
<!--name 使用数据库的表名 -->
<entity name="t_shop_product"
query=" SELECT * FROM t_shop_product WHERE rec_status='N'"
>
<!--column 是数据库的表的列,name是solr中的列名 需要在schema.xml中配置规则 -->
<field column="id" name="id"/>
<field column="pro_code" name="pro_code"/>
<field column="pro_name" name="pro_name"/>
<field column="pro_type_id" name="pro_type_id"/>
<field column="pro_img" name="pro_img"/>
<field column="price" name="price"/>
<field column="currency" name="currency"/>
<field column="origin" name="origin"/>
<field column="pro_num" name="pro_num"/>
<field column="pro_des" name="pro_des"/>
<field column="view_num" name="view_num"/>
<field column="bug_num" name="bug_num"/>
<field column="pro_tag" name="pro_tag"/>
<field column="shop_id" name="shop_id"/>
<field column="is_featured" name="is_featured"/>
<field column="shop_type_id" name="shop_type_id"/>
<field column="is_shelf_time" name="is_shelf_time"/>
<field column="is_shelf" name="is_shelf"/>
<field column="is_recom" name="is_recom"/>
<field column="memo" name="memo"/>
<field column="update_time" name="update_time"/>
<field column="creator" name="creator"/>
<field column="create_time" name="create_time"/>
<field column="modifier" name="modifier"/>
<field column="modify_time" name="modify_time"/>
<field column="rec_status" name="rec_status"/>
</entity>
</document>
</dataConfig>
由于将数据库字段映射为solr域而solr中没有定义这些域,所以就需要手动配置。
下面就来说明关于设置业务系统Field。
3、设置业务系统Field
在managed-schema
里面添加下面这些配置
<!-- product,在solr7中float,double之类的都是系统自带pfloat,pdouble -->
<field name="pro_code" type="string" indexed="true" stored="true"/>
<field name="pro_name" type="text_ik" indexed="true" stored="true"/>
<field name="pro_type_id" type="string" indexed="true" stored="true"/>
<field name="pro_img" type="string" indexed="true" stored="true"/>
<field name="price" type="text_ik" indexed="true" stored="true"/>
<field name="currency" type="string" indexed="true" stored="true"/>
<field name="origin" type="text_ik" indexed="true" stored="true"/>
<field name="pro_num" type="pint" indexed="true" stored="true"/>
<field name="pro_des" type="string" indexed="true" stored="true"/>
<field name="view_num" type="pint" indexed="true" stored="true"/>
<field name="bug_num" type="pint" indexed="true" stored="true"/>
<field name="pro_tag" type="string" indexed="true" stored="true"/>
<field name="shop_id" type="string" indexed="true" stored="true"/>
<field name="is_featured" type="string" indexed="true" stored="true"/>
<field name="shop_type_id" type="string" indexed="true" stored="true"/>
<field name="is_shelf_time" type="pdate" indexed="true" stored="true"/>
<field name="is_shelf" type="string" indexed="true" stored="true"/>
<field name="is_recom" type="string" indexed="true" stored="true"/>
<field name="memo" type="string" indexed="true" stored="true"/>
<field name="update_time" type="pdate" indexed="true" stored="true"/>
<field name="creator" type="string" indexed="true" stored="true"/>
<field name="create_time" type="pdate" indexed="true" stored="true"/>
<field name="modifier" type="string" indexed="true" stored="true"/>
<field name="modify_time" type="pdate" indexed="true" stored="true"/>
<field name="rec_status" type="string" indexed="true" stored="true"/>
<field name="product_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>
<copyField source="pro_name" dest="product_keywords"/>
<copyField source="price" dest="product_keywords"/>
<copyField source="origin" dest="product_keywords"/>
其中product_keywords
是新增加的一个多值域,而copyField
则是用于拷贝,将pro_name,price,origin
拷贝到product_keywords
域中,这样在搜索的时候就不需要分别搜索那三个域,而是直接搜索product_keywords
一次就可以返回搜索结果,提高搜索速度。
配置好这些以后,重启服务器会可以打开dataimport
了
4、导入数据
上图我用的是别人的,我的是:
接着可以搜索一下,可以看到搜索出来数据了
这是我这次的demo,里面就是一个可以启动的tomcat,直接启动就行了,启动前数据库sql要导入本地,并且修改solrhome\collection1\conf
里面的data-config.xml
,将数据库连接信息改成自己的就行了
最后浏览器访问就行了:http://localhost:8080/solr/index.html