前段时间自己简单的学习了一下Elasticsearch,但是我们目前开发项目中其实使用的还是solr,自己之前虽然也接触过solr,但是并没有系统的学习过,所以这次准备系统的学习一下。另外我看到网上很多solr服务都是和tomcat整合使用的,这点我确实不太理解(solr是个web项目没错,但是没感觉到它需要基于tomcat来使用),这次自己也是单独使用solr的,没有和tomcat做整合。
一、安装
首先下载solr,下载地址,然后选择相应的目录,我本地安装位置:
/home/ypcfly/ypcfly/software/solr/solr-7.5.0
// 常用命令
./solr start
./solr restart
./sorl stop
解压以后直接进入到安装路径下的bin目录,执行启动命令启动solr服务,启动成功后,打开浏览器访问:
localhost:8983/solr
表示服务器已经成功启动了,接下来我们需要创建一个core,一个solr服务是可以有多个core的,创建core可以直接通过命令创建
./solr create –c "core name"
也可以通过后台管理页面手动创建。先进入到 /home/ypcfly/ypcfly/software/solr/solr-7.5.0/server/solr目录下,创建一个文件夹"custom_core",并复制同目录下的configsets文件夹下的"conf"文件夹到"custom_core",然后进入solr的后台管理页面,如下图:
图-2.png
如果创建过程中出错,按照错误信息提示修改就可以了,这个过程还是很简单的。最后在"core selector"下可以选择自己的core,并进行其他的操作,到这里solr的安装以及core的创建就完成了。
二、数据导入
core创建好了之后,solr还没有数据,所以需要从数据库批量添加数据到solr服务器。数据导入可以通过solr后台管理页面导入,也可以通过代码操作solr客户端导入,这里就简单的通过后台管理页面导入数据。先选择需要导入数据的core,然后选择Dataimport,如下图:
图-3.png
但是,在导入之前我们还有两个很重要的事情需要处理:一是配置导入数据需要的处理器;二是配置数据源。
1、配置导入数据处理器
打开 /home/ypcfly/ypcfly/software/solr/solr-7.5.0/server/solr/cutom_core/conf/solrconfig.xml文件,添加导入数据处理器,这个和其他的处理器放在一起就可以了。
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
//配置文件的路径应该也可以使用绝对路径
<str name="config">dataConfig.xml</str>
</lst>
</requestHandler>
2、配置数据源
然后在conf文件夹下新建一个dataConfig.xml文件(名字自己随意取,只需要和上面solrconfig配置中的名称一致即可),并配置数据源和相关的document,也就是需要导入的数据。solr的数据源是支持多个数据库的,比方我可以使用mysql的user表,同时使用postgresql的order表,只是相对复杂一点,多库的情况个人感觉应该很少见。具体可以见solr官方文档,我依然使用的是postgresql数据库,其他数据库一样的格式。这里我document配置了最简单的单表查询。entity就是我们的"实体",column就是表的列名,name是对应的solr的Field。
<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
<dataSource
driver="org.postgresql.Driver"
url="jdbc:postgresql://localhost:5432/springboot"
user="postgres" password="123456"/>
<document>
<entity name="user" query="select * from t_user">
<field column="id" name="id"/>
<field column="username" name="userName"/>
<field column="age" name="userAge"/>
<field column="sex" name="sex"/>
<field column="address" name="address"/>
<field column="mobile" name="mobile"/>
<field column="description" name="description"/>
</entity>
</document>
</dataConfig>
数据源的配置文件配置好以后,需要将数据库查询的column的名字和solr中Field的名字对应起来,所以还需要在schema配置文件添加相关的Field,打开conf下面的managed-schema文件,添加相应的Field。
<!-- 自定义添加filed -->
<field name="userName" type="string" indexed="true" stored="true"/>
<field name="userAge" type="pint" indexed="true" stored="true"/>
<field name="sex" type="string" indexed="true" stored="true"/>
<field name="mobile" type="string" indexed="true" stored="true"/>
<field name="address" type="string" indexed="true" stored="true"/>
<field name="description" type="string" indexed="true" stored="true"/>
自定义Field的类型必须是solr已有的类型,indexed表示改字段是否支持索引,stored表示是否会存储。至于为什么我没添加id,那是因为solr已经有了id字段,所以不需要用户再去定义了。
最后一个是导入相关的jar包,因为数据导入我们使用到了数据库,所以必须要有数据库驱动的jar,另一个就是solr自带的data-import的jar。数据库驱动根据自己数据库选择,而solr自带的两个相关jar包,可以在solr解压目录"dist"目录下找到,而我本地路径:
/home/ypcfly/ypcfly/software/solr/solr-7.5.0/dist
一个是solr-dataimporthandler-7.5.0.jar,另一个是solr-dataimporthandler-extras-7.5.0.jar。将这三个jar包复制到"../server/solr-webapp/webapp/WEB-INF/lib"文件夹下。
然后重新启动solr服务器。
3、数据导入
启动好solr服务器后,打开solr后台管理页面,选择"Dataimport",勾选上"图-3"中的"Clean"和"Commit",然后点击"Excute"执行成功后,在点击旁边的"Refresh status",如果报错的话根据报错信息进行排除即可。然后我们查询一下数据是不是真的导入成功,选择查询所有数据,看结果是否一致就可以了。
图-4.png
结果总共有4条记录和我数据的数据完全一致,说明数据导入成功了。
三、安装IK分词器
其实solr也好elasticsearch一般都会配置单独的中文分词器,根据需要可能会选IK或者pingyin,也可能都安装,下面简单记录下安装IK中文分词的过程。solr也是有自带分词器的,但是对中文支持并不好,所以都会需要安装专门的中文分词器。
1、配置IK
先根据自己solr版本下载相应的IK分词器包,下载地址。感觉solr版本的IK下载地址不太好找,不像Elasticsearch非常容易找到每个版本对应的IK。下载的时候选择jar格式,下载之后将jar包复制到"../server/solr-webapp/webapp/WEB-INF/lib"文件夹下,我的本地路径是:
/home/ypcfly/ypcfly/software/solr/solr-7.5.0/server/solr-webapp/webapp/WEB-INF/lib
然后在WEB-INF文件夹下新建一个"classes"文件,复制IK分词器需要的相关配置文件(我是从jar包解压获取的)到classes目录下,其实主要就一个,那就是"IKAnalyzer.cfg.xml",也就是IK的配置文件,内容也不多,如果找不到直接复制就行
<?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">custom.dic;</entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords">stopword.dic;</entry>
</properties>
在上面的配置文件中我已经自定义了我的用户词典,当然还没用配置相关的词。用户词典应该也可以配置远程字典的,但是这里不知道为什么没有。
2、配置schema
这里我们需要打开"core"/conf目录下的"managed-schema"文件,然后添加上IK的分词器的配置内容:
<fieldType name="ik_word" class="solr.TextField">
<analyzer type="index">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false" conf="ik.conf"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true" conf="ik.conf"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
名字自己随意就好了,到这里关于IK分词器的整个配置就完成了,接下来使用IK分词器测试一下
3、测试
配置IK完成后启动solr服务器,选择自定义的core,选择"Analysis",随意输入一段中文,然后选择到"ik_word"(和上面managed-schema配置中自己定义名称一致),点击右侧"Analyse Values",结果如下:
图-5.png
这个时候我自定义的用户字典还每没添加任何的词语,但是根据结果也看出来,其实IK已经帮我们做了一些分词了,只是效果比较差,更多的还是一个一个的汉字,下面是分词结果:
嵎 山金 金碧 有 光辉 迁 停车 车马 正 轻 肥 弥 思 王 褒 拥 节 去 复 忆 相 如 乘 传 归 君 平 子 云 寂 不 嗣 江汉 汉英 英灵 已 信 稀
这是IK默认的分词效果,现在我们使用我们自己的那字典,然后再测试一下。先进入相关的文件夹,即
/home/ypcfly/ypcfly/software/solr/solr-7.5.0/server/solr-webapp/webapp/WEB-INF/classes
打开自定义的字典文件custom.dic,并添加几个词语,我添加的词语如下:
嵎山 正轻肥 弥思王褒 复忆 乘传归 君平子云 已信稀
也就是说这些词会被solr单独分出来作为一个不可分的最小单元,完成后重新启动solr再测试一次,结果如下:
图-6.png
相比第一次没添加的时候已经好些了,整个分词结果如下:
嵎山 山金 金碧 有 光辉 迁 停车 车马 正轻肥 弥思王褒 拥 节 去 复忆 相 如 乘传归 君平子云 寂 不 嗣 江汉 汉英 英灵 已信稀
通过两次分词结果对比很直观的就发现,自定义字典里的词都已经分出来了,但是感觉效果还是不太好,我记得IK应该是可以指定最大分词和最小分词的,但是和solr的整合中自己还没有发现这个功能。
好了,这次关于solr的入门学习先到这里,关于solr的一些基本操作下次再继续学习吧,到时候可以通过一个简单的demo,学习一下如何在代码中使用solr。
网友评论