Solr 是一个高性能,采用 Java 开发基于 Lucene 的全文搜索服务器。同时对其进行了扩展,提供了比Lucene 更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。
文档通过 Http 利用 XML 加到一个搜索集合中。查询该集合也是通过 http 收到一个 XML/JSON 响应来实现。它的主要特性包括:高效、灵活的缓存功能,垂直搜索功能,高亮显示搜索结果,通过索引复制来提高可用性,提供一套强大 Data Schema 来定义字段,类型和设置文本分析,提供基于 Web 的管理界面等。
Solr 的下载安装
在 http://archive.apache.org/dist/lucene/solr/ 页面可以下载所有的 Solr 发行版,当前最新的发行版为 7.3.1,本文将以 7.3.1 作为演示版本。
Solr 7 最低需要 Java1.8 以上版本 Java,由于 Solr 已经内嵌 jerry,所以不需要关心 jetty 版本,如果需要使用 Tomcat 作为容器,则需要 Tomcat 8 以上版本的 Tomcat 来运行 Solr。
关于 Java 的安装,这里不再叙述,可参考 CentOS 7 安装 JRE与环境变量配置 。
将下载好的 solr-7.3.1.zip
或 solr-7.3.1.tgz
解压到 /usr/local/solr/
中,该位置可以自定,以下命令皆在该目录下进行,可以根据实际情况进行修改。
解压命令:unzip solr-7.3.1.zip
或者 tar -zxvf solr-7.3.1.tgz
。
drwxr-xr-x. 3 root root 4096 5月 9 09:31 bin //用来启动内嵌jetty的solr,可一键启动的命令目录
-rw-r--r--. 1 root root 791609 5月 9 09:31 CHANGES.txt
drwxr-xr-x. 12 root root 4096 5月 9 09:31 contrib //solr的相关扩展包
drwxr-xr-x. 4 root root 4096 5月 9 09:31 dist //solr相关的工程的jar包,包括solr、solrj、测试框架的相关jar包
drwxr-xr-x. 3 root root 4096 5月 9 09:31 docs //solr相关文档
drwxr-xr-x. 7 root root 4096 5月 9 09:31 example //solr自带的示例程序
drwxr-xr-x. 2 root root 32768 5月 9 09:31 licenses //solr用到的程序的协议
-rw-r--r--. 1 root root 12872 5月 9 09:31 LICENSE.txt
-rw-r--r--. 1 root root 689623 5月 9 09:31 LUCENE_CHANGES.txt
-rw-r--r--. 1 root root 25453 5月 9 09:31 NOTICE.txt
-rw-r--r--. 1 root root 7679 5月 9 09:31 README.txt
drwxr-xr-x. 10 root root 4096 5月 9 09:31 server //solr相关程序,资源及配置文件
可以使用 bin/solr start
命令直接启动 Solr,使用该命令启动的 Solr 的默认端口为 8983,使用 ip:8983
即可访问 Solr 管理界面。
Solr 无法访问的情况
如果利用自带的命令成功启动 Slor,但页面没有显示、显示无法连接或连接超时等情况,可以使用检查 CentOS 的防火墙是否开放 8983 端口。
CentOS 6
关闭防火墙:
service iptables stop #iptables
chkconfig iptables off #禁止iptables开机启动
service iptables status #查看默认防火墙状态
开启端口:
在配置文件 /etc/sysconfig/iptables
修改或添加以下内容
vi /etc/sysconfig/iptables
-A INPUT -p tcp -m state --state NEW -m tcp --dport 8983 -j ACCEPT #打开端口
-A INPUT -p tcp -m state --state NEW -m tcp --dport 8983 -j ACCEPT #关闭端口
接着重启防火墙 /etc/init.d/iptables restart
或 service iptables start
。
CentOS 7
关闭防火墙:
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动
firewall-cmd --state #查看默认防火墙状态(关闭后显示notrunning,开启后显示running)
开启端口的命令:
firewall-cmd --zone=public --add-port=8983/tcp --permanent #(--permanent永久生效,没有此参数重启后失效)
在 Tomcat 中安装 Solr
Solr7 需要 Tomcat8 以上版本的 Tomcat,在 https://tomcat.apache.org/download-80.cgi 也在 Tomcat8,在 https://tomcat.apache.org/download-90.cgi 下载 Tomcat9。
将下载好的 apache-tomcat-8.5.31.tar.gz
解压到 /usr/local/solr/
中,该位置可以自定,以下命令皆在该目录下进行,可以根据实际情况进行修改。
新建 Solr home 文件夹
在 /usr/local/solr/apache-tomcat-8.5.31/
下新建 solrhome
,路径和文件夹名称可以自定,以下命令皆在该目录下进行,可以根据实际情况进行修改。
mkdir /usr/local/solr/apache-tomcat-8.5.31/solrhome
将 Solr 提供的默认配置文件复制到 Solr home 文件夹下:
cp -r /usr/local/solr/solr-7.3.1/server/solr/* /usr/local/solr/apache-tomcat-8.5.31/solrhome
将运行 Solr 所需要的文件及 Jar 文件复制到 Tomcat 中
- 在 Tomcat 的 webapps 文件夹中新建
solr
文件夹。
mkdir /usr/local/solr/apache-tomcat-8.5.31/webapps/solr/
- 将 Solr 提供的 Java Web 文件复制到上面创建的文件夹中
cp -r /usr/local/solr/solr-7.3.1/server/solr-webapp/webapp/* /usr/local/solr/apache-tomcat-8.5.31/webapps/solr/
- 将 Solr 运行的其它依赖 Jar 文件复制到项目中
cp -r /usr/local/solr/solr-7.3.1/server/lib/ext/* /usr/local/solr/apache-tomcat-8.5.31/webapps/solr/WEB-INF/lib/
cp -r /usr/local/solr/solr-7.3.1/server/lib/metrics*.* /usr/local/solr/apache-tomcat-8.5.31/webapps/solr/WEB-INF/lib/
cp -r /usr/local/solr/solr-7.3.1/dist/solr-dataimporthandler-*.* /usr/local/solr/apache-tomcat-8.5.31/webapps/solr/WEB-INF/lib/
- 复制 log4j 的配置文件
mkdir -p /usr/local/solr/apache-tomcat-8.5.31/webapps/solr/WEB-INF/classes/
cp /usr/local/solr/solr-7.3.1/server/resources/log4j.properties /usr/local/solr/apache-tomcat-8.5.31/webapps/solr/WEB-INF/classes/
修改 Solr 的 web.xml 配置文件
设置 Solr 的配置目录,打开 env-entry
标签的注释,并注释掉 security-constraint
标签,env-entry
标签用来设置 Solr 的配置目录,security-constraint
会引起访问权限不足而导致无法访问,这里先进行注释。
vim /usr/local/solr/apache-tomcat-8.5.31/webapps/solr/WEB-INF/web.xml
按照如下进行设置:
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-value>/usr/local/solr/apache-tomcat-8.5.31/solrhome</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
...
<!--
<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>
-->
此时,访问 IP:PORT/solr/
应该就能看见 Solr 的管理页面,如果 Tomcat 报 404 错误,请检查下 Jar 文件是否已经全部导入到 Tomcat 项目中了。
新建 Core
由于 Solr 页面已经提供了新建 Add Core
的功能,只需要少量设置就可以创建一个 Core。也可以手动创建 Core,这里不再叙述。
创建 Core 文件夹
Solr 创建页面上提示在创建 Core 之前,需要提前创建好 instanceDir
和 dataDir
,所以我们先按要求创建好这两个文件夹
mkdir -p /usr/local/solr/apache-tomcat-8.5.31/solrhome/user_core/data/
接着在页面按照要求进行填写:
点击 Add Core
按钮之后,Solr 就会创建一个 Core。
配置中文分词器
在进行中文分词的时候,需要用到中文分词器。
Smartcn
Smartcn 一种是基于中科院 ICTCLAS 的隐式马尔科夫HMM算法的中文分词器。因为 Solr 发行包中提供了 Smartcn 的 Jar 包,所以优先使用这种分词方法,但是这个分词工具不支持自定义词库。
- 首先将 Smartcn 的 jar 文件复制到 Solr 项目中
cp /usr/local/solr/solr-7.3.1/contrib/analysis-extras/lucene-libs/ucene-analyzers-smartcn-7.3.1.jar /usr/local/solr/apache-tomcat-8.5.31/webapps/solr/WEB-INF/lib/
- 修改打开 Solr home 中的配置文件
vim /usr/local/solr/apache-tomcat-8.5.31/solrhome/user_core/conf/managed-schema
在配置文件末尾添加 一个 filedType 和 一个 field(用于测试中文分词器是否可用,具体用于需要检索的字段)
<fieldType name="text_smartcn" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
</analyzer>
</fieldType>
<field name ="text" type ="text_smartcn" indexed ="true" stored ="true" />
- 重启 Solr 服务
重启之后,在 Core 下面的 Analysis 页面中的Analyse Fieldname / FieldType:
就能看到设置的这个text
字段,可以进行中文分词测试。
IK Analyzer
IK Analyzer 一种是基于最大匹配的分词器。IK Analyzer 的下载地址:https://code.google.com/p/ik-analyzer/ 。该项目在 2012 年之后,就没有进行更新,其所依赖的lucene相关组件的版本为4.X,已经不能适配最新的 Solr。
以下是非官方的修改支持新版 Solr 的版本,下载地址:ikanalyzer-solr6.5.zip。
- 将 IK Analyzer 需要用到的 jar 文件复制到 Solr 项目中
cp solr-analyzer-ik-5.1.0.jar /usr/local/solr/apache-tomcat-8.5.31/webapps/solr/WEB-INF/lib/
cp ik-analyzer-solr5-5.x /usr/local/solr/apache-tomcat-8.5.31/webapps/solr/WEB-INF/lib/
- 将 IK Analyzer 需要用到的文件复制到到项目中
ext.dic 为扩展字典
stopword.dic 为停止词字典
IKAnalyzer.cfg.xml 为配置文件
cp ext.dic /usr/local/solr/apache-tomcat-8.5.31/webapps/solr/WEB-INF/classes/
cp stopword.dic /usr/local/solr/apache-tomcat-8.5.31/webapps/solr/WEB-INF/classes/
cp IKAnalyzer.cfg.xml /usr/local/solr/apache-tomcat-8.5.31/webapps/solr/WEB-INF/classes/
- 修改打开 Solr home 中的配置文件
vim /usr/local/solr/apache-tomcat-8.5.31/solrhome/user_core/conf/managed-schema
在配置文件末尾添加 一个 filedType 和 一个 field(用于测试中文分词器是否可用,具体用于需要检索的字段)
<fieldType name="text_ik" class="solr.TextField">
<analyzer type="index">
<tokenizer class="org.apache.lucene.analysis.ik.IKTokenizerFactory" useSmart="true"/>
</analyzer>
<analyzer type="query">
<tokenizer class="org.apache.lucene.analysis.ik.IKTokenizerFactory" useSmart="true"/>
</analyzer>
</fieldType>
<field name ="text" type ="text_smartcn" indexed ="true" stored ="true" />
- 重启 Solr 服务
重启之后,在 Core 下面的 Analysis 页面中的Analyse Fieldname / FieldType:
就能看到设置的这个text
字段,可以进行中文分词测试。
本文部分内容来自: