全文搜索引擎—Solr入门浅析

一.简介

        Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件或JSON格式数据,生成索引;也可以通过Http Get操作提出查找请求,并得到XML/JSON格式的返回结果。

        Solr是一个高性能,采用Java5开发,底层基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎,单纯作为一个开源的全文搜索引擎工具的话,solr丰富的功能也可作为一个黑盒子做到开箱即用。目前大部分的电商平台都在采用solr作为其商品搜索引擎。

        这里再讲一下全文搜索引擎的实现原理,全文搜索引擎之所以可以实现全文搜索,最根本的原理是其数据索引使用的是倒排索引,跟我们常见的数据库中的索引顺序或者关联方向正好是相反的,就拿文章标题和文章内容举例,传统数据库中的一般的索引关联是这个文章标题id对应这篇文章的内容,是从文章标题id向文章内容这个方向建立的关联关系,而倒排索引将这个模型颠倒过来了,将文章中的每个词语、每个关键字与它们出现的文章标题对应起来,建立关联索引,从而实现了通过搜索关键字词可以搜索到相关的文章内容和哪一篇文章中出现过你搜素的关键字词。

二.安装部署

        solr需要运行在一个Servlet容器中,Solr6.5.1要求jdk使用1.8以上,Solr默认提供Jetty(solr自身集成了Jetty,java写的Servlet容器,也可以直接启动),这里说下用Tocmat作为Servlet容器,环境如下:Linux:Red hat 6.0 ,Solr:Solr6.5.1,Jdk:jdk1.8.0_121,Tomcat:apache-tomcat-8.5.14(solr6.5.1需要tomcat8.0以上)

1.安装jdk 

2.安装tomcat 

2.1.下载Tomcat包,6.0以上的solr需要tomcat8以上,使用tomcat7问题太多。

apache-tomcat-8.5.14.tar.gz

2.2.手动上传Tomcat,解压

[root@localhost /]#tar -zvxf apache-tomcat-8.5.14.tar.gz

2.3.建立solr文件路径

[root@localhost /]#mkdir /usr/local/solr

2.4.复制Tomcat文件到solr目录

[root@localhost /]#cp apache-tomcat-8.5.14 /usr/local/solr/tomcat -r

3.上传solr到服务器

可使用rz上传

4.解压solr

[root@localhost /]#tar -zxf solr-6.5.1.tgz

5.solr-6.5.1\server下的solr-webapp/webapp文件夹拷贝到tomcatwebapps下,并重命名为solr

[root@localhost tmp]#cp  solr-6.5.1/server/solr-webapp/webapp  /usr/local/solr/tomcat/webapps/solr -r

6.拷贝solr-6.5.1\server\lib\ext下的jar包到tomcat\webapps\solr项目的WEB-INF\lib下;

[root@localhost tmp]#cp solr-6.5.1/server/lib/ext/* /usr/local/solr/tomcat/webapps/solr/WEB-INF/lib/

7.拷贝solr-6.5.1\dist下solr-dataimporthandler  jar包,solr-dataimporthandler-extras-6.5.1.jar包到tomcat\webapps\下solr项目的WEB-INF\lib下

[root@localhost tmp]#cp solr-6.5.1/dist/solr-dataimporthandler-6.5.1.jar /usr/local/solr/tomcat/webapps/solr/WEB-INF/lib/

[root@localhost tmp]#cp solr-6.5.1/dist/solr-dataimporthandler-extras-6.5.1.jar /usr/local/solr/tomcat/webapps/solr/WEB-INF/lib/

8.拷贝solr-6.5.1\server\lib下所有metrics开头的jar

[root@localhost tmp]#cp  solr-6.5.1/server/lib/metrics*  /usr/local/solr/tomcat/webapps/solr/WEB-INF/lib/

9.拷贝solr-6.5.1\server下的solr文件夹到tomcatwebapps,重命名为solrhome或者是其他名字;

所谓的Solrhome目录实际上是一个运行的Solr实例所对应的配置和数据(Lucene索引)。

[root@localhost tmp]#cp  solr-6.5.1/server/solr  /usr/local/solr/tomcat/webapps/solrhome  -r

10.web.xml配置

修改tomcat\webapps\solr(solr的项目名)\WEB-INF\web.xml,找到如下代码,去掉注释,/put/your/solr/home/here改为你自己的solrhome的路径,如:

[root@localhost WEB-INF]# vim/usr/local/solr/tomcat/webapps/solr-webapp/webapp/WEB-INF/web.xml

找到,去掉注释,修改路径为/usr/local/solr/tomcat/webapps/solrhome/


找到以下代码并注释,解决权限问题




11.拷贝solr-6.1.0\server\resources下的log4j.properties到tomcat\webapps\solr\WEB-INF\classes,如果WEB-INF下没有classes文件那么就创建一个classes文件夹。

[root@localhost ~]#cd /usr/local/solr/tomcat/webapps/solr/WEB-INF/classes

[root@localhost WEB-INF]#mkdir  classes

[root@localhost tmp]#cp  solr-6.5.1/server/resources/log4j.properties  /usr/local/solr/tomcat/webapps/solr/WEB-INF/classes

12.启动tomcat

[root@localhost /]#cd  /usr/local/solr/tomcat 

[root@localhost tomcat]#bin/startup.sh

13.访问

http://192.168.163.100:8080/solr/index.html#/   


此页面是solr自带的一个控制台页面,可以进行solr内核、solr索引创建与管理,数据搜索和测试等。

创建一个core(就是创建一个solr内核,类似于数据库中新建一个数据库实例)

(1)在solrhome下面创建my_core文件夹(就是solr内核名,可根据实际命名),在my_core文件夹下创建data和conf文件夹

[root@localhost solrhome]#mkdir my_core

[root@localhost solrhome]#cd my_core

[root@localhost my_core]#mkdir data

[root@localhost my_core]#mkdir conf

[root@localhost my_core]# ll

总用量 0

drwxr-xr-x. 2 root root 6 5月 8 04:00 conf

drwxr-xr-x. 2 root root 6 5月 8 04:00 data

(2)将solr-6.3.0\example\example-DIH\solr\solr\solr\conf所有文件和文件夹都copy到solrhome\my_core\conf下;

[root@localhost tmp]#cp -Rf solr-6.5.1/example/example-DIH/solr/solr/conf/* /usr/local/solr/tomcat/webapps/solrhome/my_core/conf/

3启动tomcat,访问solr,创建core,新增core即可完成;


(4)可以在“core selector”这里查询和编辑你的solr相关信息;

三.配置solr索引文件说明

        solr安装好建立了第一个solr内核之后,就可以往内核里导入数据了,solr可以导入数据库数据,也可以导入二进制文件中的文本(PDF、微软office、和OpenOffice等)等其他数据。solr自身带了几个文档索引导入工具:(1)数据库导入处理器Data Import Handler ,DIH  (2)ExtractingRequestHandler ,又名Solr Cell ,solr cell 使用Apache的Tika工具进行文本抽取,从而从二进制文件中抽取文本和元数据        (3)Apache Nutch,一个基于java的开源网络爬虫,可以与solr无缝集成,开箱即用,可以实现采集到的网页被自己的solr应用搜索到。(4)java项目使用solr的客户端SolrJ进行交互

        solr中有两个重要的配置文件: solrconfig.xml(索引管理配置文件)和schema.xml(创建索引文件),下面讲下schema.xml,位于内核目录下的conf目录下

在schema.xml中建立solr索引字段就类似于数据中在表中定义相关的数据字段,其字段的种类包含多值字段、动态字段、复制字段、唯一键字段等。

1、在solr中默认是中文分析器,需要手工配置。配置一个FieldType,在FieldType中指定中文分析器(分词器相关下面会说到)。

2、Solr中的字段必须是先定义后使用。

3、在solrhome建的内核文件夹的conf的managed-schema文件配置索引,老版本solr是schema.xml

4.   假设定义了几个如下图所示的业务字段


        其中type是指定该字段用哪个分词器匹配,indexed=true是能够被搜索到,stored=true是可以在搜到后返回数据用于前台显示,设置false,前台不会显示该字           段数据,下面的将上面常用的搜索字段都配置到一个复制字段中,是solr自优化的一种配置方法,就类似以数据库中原来需要多表联查的数据,改造成单表查询         的,这样的查询和执行速率更高。这样solr索引就配置好了,就可以向solr中导入数据了,这个schema.xml中配置的所有字段相当于数据库中的一张大表。

四.分词器相关说明

        在搜索引擎的发展中,一开始的搜索引擎可以通过简单的输入关键词进行内容搜索匹配,随着信息技术的发展,用户输入的内容不再仅仅局限于关键字了,可能会输入一段话或者描述进行搜索,但是全文搜索引擎的本质还是基于关键字词搜索的,这个时候怎么才能将用户输入内容进行分析搜索呢,于是就诞生了分词器,分词器可以将用户输入的话语和描述,分成一些关键字或者词,然后再传入到搜索引擎进行搜索。

目前开源的分词器也比较多,这里介绍IK-Analyzer——IK分词器。solr的除了自身强大的功能外,还可以自由的集成其他优秀的扩展件,solr自身也带了几个分词器,大多是英文的,这里ik是中文分词器。

      IK-Analyzer——IK分词器集成到solr

1.第一步:使用IK-Analyzer。把分析器的文件夹上传到服务器。


2.第二步:需要把分析器的jar包添加到solr工程中。

[root@bogon IK Analyzer 2012FF_hf1]# cp ik-analyzer-solr5-5.x.jar/usr/local/solr/tomcat/webapps/solr/WEB-INF/lib/

[root@bogon IK Analyzer 2012FF_hf1]# cp solr-analyzer-ik-5.1.0.jar /usr/local/solr/tomcat/webapps/solr/WEB-INF/lib/

3.第三步:需要把IKAnalyzer需要的扩展词典及停用词词典、配置文件复制到solr工程的classpath。

/usr/local/solr/tomcat/webapps/solr/WEB-INF/classes

[root@bogon IK Analyzer 2012FF_hf1]# cp  IKAnalyzer.cfg.xml   ext_stopword.dic   mydict.dic   /usr/local/solr/tomcat/webapps/solr/WEB-INF/classes

注意:扩展词典及停用词词典的字符集必须是utf-8。不能使用windows记事本编辑,注意每配置一个词要换行。

其中ext_stopword.dic(停用字典是用于配置语句中类似一些语气词 啊 这 那 等一些对搜索没有帮助的字和词的),

mydict.dic(用户拓展字典)是用于根据自己系统配置一些让分词器认为是一个完整的关键词,这样在搜索时分词器就不会将这个词再给继续拆分成更细的关键词了。

4.第四步:配置fieldType。需要在solrhome/collection1/conf/schema.xml中配置。

技巧:使用vi、vim跳转到文档开头gg。跳转到文档末尾:G


5.配置好分词器,重启solr,在solr自带的控制台页面可以体验安装好的分词器,试试分词效果。

在建好的solr内核下的Analysis菜单下的FieldType选择刚才安装的ik分词词,这里显示的名字就是在schema.xml配置的名字。


输入一句话,查看分词效果,最终分词的效果可以通过分词的停用词典和拓展词典进行调节,这和搜索引擎应用的建立是一样的,要想做出更好用的搜索应用,需要不断的进行优化。



五.其他参数说明

将数据导入到solr中建立好索引之后,在进行搜索时,有几个重要参数,需要明确。

1.在将数据导入到solr中之后,在solr的控制台页面可以进行搜索查看导入的数据,在建立的内核的Query菜单下,如下图,在我导入了一份电商商品的数据,默认搜索全部,总数据条数3096条。



2.参数   q   :主查询字段,用于输入搜索内容

   参数   fq  :过滤查询,限制搜索结果,可用来限定搜索范围,过滤搜索内容

   参数 sort :用于指定搜索结果排序的字段,如输入 price asc 就是按价格从低到高排列

   参数 start ,rows :首页从那一条数据开始,每页显示几条数据,用于搜索返回结果分页的

   参数   fl    :     为搜索结果中的每个文档指定要返回的字段

   参数  df   :  默认搜索字段

   参数   wt  :指定响应输出类型,xml,csv,php,python,json等

        还有一些高级功能如分面与搜索结果高亮等。其中最常用的搜索结果高亮参数 hl  ,可以指定那些索引字段加搜索结果高亮,以及设定高亮的样式等。这个搜索结果高亮几乎是现在搜索引擎必备的一个功能,很提升用户体验的一个功能,会将搜索结果中的用户输入搜索的关键字进行样式区别显示,其原理也比较简单,由于搜索引擎本身可以按照用户的搜索的关键字词给匹配出相应的内容,然后在匹配出的内容中将含有用户输入的搜索关键词用前台页面的样式标签给包起来,这样数据最终返回给前台页面显示的时候,搜索关键词自然会高亮显示。

        其中q 和fq都可以当做一个过滤器使用,q是一个特殊的过滤器。fq过滤器用法  fq:字段名:值1  OR/AND  字段名:值2    比如限定商品的搜索范围  fq=

item_category_name:空调ANDitem_price:2000  就是搜索价格是2000的空调。用fq过滤器就可以实现一些对于不同用户可以搜索的内容范围不一样的需求,可以实现搜索应用的搜索范围权限问题。


        总之,solr的各种功能非常丰富,solr也在越更新越强大,还有一些solr进阶的操作像solrcloud下的分布式索引、分布式搜索、分片、备份等高级操作感兴趣的同学可以进阶学习。还有就是solr由于本身是个搜索引擎,因此也可以做一些简单的推荐功能,根据用户注册的一些关注点,可以从自己的索引库里将有关内容搜索出来推送给用户,做一些简单的推荐功能。

        在百度网盘我上传了一个solr电商搜索的小demo,以及相关商品数据(mysql数据库导出的),一些简单的基础用法可以进行参考:https://pan.baidu.com/s/1dFAk9rF 

推荐阅读更多精彩内容