Solr服务器的搭建过程
为什么要搭建Solr服务器?
对于一般的单体项目来说,我们在查询某样产品的时候,为了加快检索的速度,一般都要建立索引(B+树),在后台主要是通过模糊查询查找数据,但是如果sql语句是select * from user where name like %peace%
它并不会走索引,而是要走全表扫描。对于当今的电商项目来说数据量大,如果走全表扫描,效率会很低下,虽然Mysql5.6之后提供了全文索引,但是是在数据库层面进行操作的,对数据库的压力比较大,主要是走磁盘的方式(IO),然后我们使用了solr或者es。
solr服务器的整体架构如下:
1.下载Solr的安装包:http://archive.apache.org/dist/lucene/solr/
2.新建文件solr,将压缩文件上传到solr文件夹中
3.解压,删除压缩包
对于solr目录的关键字说明:
bin: solr的运行脚本
dist: 包含一个可以连通tomcat和solrhome的可运行的war包
docs:solr的api文档
example:solr工程的例子目录。 example/solr该目录是一个标准的SolrCore目录的内容为
collection就是一个solr core
4.把solr复制一份到/usr/local/solrhome
5.进入到solr的dist目录 ,将solr的war包复制到tomcat
[root@192 dist]# cp solr-4.10.4.war /usr/local/myTomcat/tomcat/webapps/
6.到/usr/local/myTomcat/tomcat/webapps/目录下,解压solr的压缩包
只需要启动tomcat即可!
查看启动日志的时候,报错:
原因:tomcat启动了两次,导致冲突
解决办法:关闭tomcat,重新启动即可
[root@192 bin]# ./shutdown.sh
[root@192 bin]# ./startup.sh
完美解决!!!!!!
7.拷日志的架包或者日志的配置文件
创建一个放配置文件的地方
[root@192 WEB-INF]# mkdir classes
去哪里找架包或者日志的地方?
[root@192 example]# cd lib/ext/
将架包复制到/usr/local/myTomcat/tomcat/webapps/solr/WEB-INF/lib/
进入同级的resources文件
[root@192 example]# cd resources/
复制日志文件
查看我们创建的solrhome文件:
在上述的操作中已经把tomcat和solr配置已经结束了!
8 tomcat和solr建立联系
进入到cd /usr/local/myTomcat/tomcat/webapps/solr/WEB-INF/
目录下的web.xml, 使用vi web.xml 修改文件的内容,其中env-entry-value中的值是你自己的solrhome文件路径
9.验证是否连接成功
启动tomcat
[root@192 bin]# ./startup.sh
打印的日志(看是否启动成功):
通过http://192.168.1.105:8080/solr/进行访问
ok!!!l连接成功!!!!
10 安装中文分词器(IKAnalyzer)及扩展词典
上传IKAnalyzer,把IKAnalyzer依赖的jar添加到lib中,在WEB-INF下面新建一个classes文件,将分析器的配置文件放入classes文件夹中。
在solrcore中指定中文分析器,需要在schema.xml中配置,配置的是solrhome里面的东西
需要: 自定义一个FieldType, 在schema.xml中去定义,在FieldType中指定分析器。
重新启动tomcat时报错:java.lang.AbstractMethodError
这是由于solr和IKAnalyzer版本不匹配,更换一下其它版本,使用的solr-4.10.4 ,而IKAnalyzer使用的版本过高,替换成IKAnalyzer2012FF_u1,就ok啦!!!
添加停用词stopword.dic和扩展词典ext.dic
访问http://192.168.1.103:8080/solr/
分词器添加成功!!!
11.solr自定义Field
这里主要是连接数据库与solr-core
创建索引库
还是在schema.xml文件中自定义一个FieldType
上图解释:
<field name="product_name" type="text_ik" indexed="true" stored="true"/>
在导入product_name的时候使用我们定义的中文分词text_ik进行分词,indexed按照名称进行搜索,stored存储,type="int"时不进行分词,
<field name="product_keywords" type="text_ik" indexed="true" stored="true"
multiValued="true"/>
<!--将商品名称添加到目标域-->
<copyField source="product_name" dest="product_keywords"/>
<!--将商品卖点添加到目标域-->
<copyField source="sale_point" dest="product_keywords"/>
目标域:主要是解决多个字段联合查询的问题,multiValued多重值,product_keywords是一个复合字段包括了product_name,sale_point等字段,既会按照product_name去搜索,也会按照sale_point去搜索。
重启tomcat!!! ok!!!