登录后台

页面导航

本文编写于 2410 天前,最后修改于 1505 天前,其中某些信息可能已经过时。

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.zipsolr-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 restartservice 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 中

  1. 在 Tomcat 的 webapps 文件夹中新建 solr 文件夹。

mkdir /usr/local/solr/apache-tomcat-8.5.31/webapps/solr/

  1. 将 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/

  1. 将 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/
  1. 复制 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 之前,需要提前创建好 instanceDirdataDir,所以我们先按要求创建好这两个文件夹

mkdir -p /usr/local/solr/apache-tomcat-8.5.31/solrhome/user_core/data/

接着在页面按照要求进行填写:

title=

点击 Add Core 按钮之后,Solr 就会创建一个 Core。

配置中文分词器

在进行中文分词的时候,需要用到中文分词器。

Smartcn

Smartcn 一种是基于中科院 ICTCLAS 的隐式马尔科夫HMM算法的中文分词器。因为 Solr 发行包中提供了 Smartcn 的 Jar 包,所以优先使用这种分词方法,但是这个分词工具不支持自定义词库。

  1. 首先将 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/

  1. 修改打开 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" />
  1. 重启 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

  1. 将 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/
  1. 将 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/
  1. 修改打开 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" />
  1. 重启 Solr 服务
    重启之后,在 Core 下面的 Analysis 页面中的 Analyse Fieldname / FieldType: 就能看到设置的这个 text 字段,可以进行中文分词测试。

本文部分内容来自:

  1. https://blog.csdn.net/shanshanw/article/details/78805454
  2. https://blog.csdn.net/jiadajing267/article/details/78692702
  3. https://blog.csdn.net/qq_28114645/article/details/77961998
  4. https://blog.csdn.net/zcl_love_wx/article/details/52091622