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

安装 JDK

下载 JDK

点击进入下载页面

根据操作系统版本选择对应的 JDK 版本

安装配置

官方安装指南

  • 全局生效,修改 /etc/profile
  • 当前登录用户有效,修改 ~/.bash_profile
  • 当前 shell 会话有效,直接在 shell 窗口执行
# JAVA HOME
export JAVA_HOME=/web/applications/jdk
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
source /etc/profile

安装 solr

下载

点击进入下载页面并下载

直接解压缩即可

基本帮助指令

./bin/solr --help
./bin/solr COMMAND -help

启动

./bin/solr start -m 1g -a "-Duser.timezone=ASIA/Shanghai" -force

如果运行在 root 用户下,请添加 -force ,但给予安全因素考虑不推荐;推荐为 solr 单独创建低权限用户,并以此用户身份运行。

创建 core

本想在web管理界面创建 core,发现不是那么回事。不能自动创建相关配置文件,最后用了命令行模式

./bin/solr create_core -c solr_instance1 -force

以 root 用户身份运行时,需要追加 -force

删除 core

./bin/solr delete -c solr_instance1 

中文分词配置

安装 lucene-analyzers-smartcn

cp contrib/analysis-extras/lucene-libs/lucene-analyzers-smartcn-6.6.1.jar server/solr-webapp/webapp/WEB-INF/lib/

安装 iKAnalyzer

wget https://github.com/3Dot141/IKAnalyzer/blob/master/out/artifacts/iKAnalyzer_jar/iKAnalyzer.jar?raw=true -O server/solr-webapp/webapp/WEB-INF/lib/iKAnalyzer.jar

配置上述词库

修改每一个 core 下的 conf/managed-schema 文件,并在最后添加如下内容:

    <!--Chinese analysis-->
    <fieldType name="text_sm" 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>

    <!--IKAnalyzer-->
    <fieldType name="text_ik" class="solr.TextField" positionIncrementGap="100">
        <analyzer type="index">
            <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory"/>
        </analyzer>
        <analyzer type="query">
            <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory"/>
        </analyzer>
    </fieldType>

配置扩展词典

如果有需要,可以配置扩展词典以及停止词。

打开 joop Github 并切换到 「src/main/resources」,下载 如下三个文件:

  • IKAnalyzer.cfg.xml
  • ext.dic
  • stopword.dic

之后,将这三个文件放到「server/resources」目录下。

配置 schema 定义

注意: 新版本的 solr 默认使用 managed-schema 配置文件,而 schema.xml 的话需要特殊设置,详情可以看 这里

字段和字段类型定义可见章节 Documents, Fields, and Schema Design

以 phpbb 的示例如下,在 managed-schema 新增:

    <!-- phpbb defined -->
    <field name="post_id" type="int" indexed="true" stored="true" required="true" multiValued="false" />
    <field name="topic_id" type="int" indexed="true" stored="true" required="true" multiValued="false" />
    <field name="forum_id" type="int" indexed="true" stored="true" required="true" multiValued="false" />
    <field name="poster_id" type="int" indexed="true" stored="true" required="true" multiValued="false" />
    <field name="post_time" type="int" indexed="true" stored="true" required="false" multiValued="false" />
    <field name="post_subject" type="text_ik" indexed="true" stored="true" required="false" multiValued="false" />
    <field name="post_text" type="text_ik" indexed="true" stored="false" required="false" multiValued="false" />
    <field name="post_attachment" type="int" indexed="true" stored="true" required="false" multiValued="false" />
    <field name="post_edit_time" type="int" indexed="true" stored="true" required="false" multiValued="false" />
    <field name="post_visibility" type="int" indexed="true" stored="true" required="false" multiValued="false" />
    <field name="is_first" type="boolean" indexed="true" stored="true" required="false" multiValued="false" />
    <field name="topic_type" type="int" indexed="true" stored="true" required="false" multiValued="false" />
    <field name="topic_visibility" type="int" indexed="true" stored="true" required="false" multiValued="false" />
    <field name="poster_name" type="string" indexed="true" stored="true" required="false" multiValued="false" />

默认的 id 相关设置移除,uniqueKey 做了变更

配置数据导入

这里可以配置数据库的导入,即DIH(Data Import Handler)。此处以 Phpbb 的配置 mysql 为示例了。

cp dist/solr-dataimporthandler-*.jar server/solr-webapp/webapp/WEB-INF/lib/

MySQL Connector/J 下载 java 的类库,并放到 server/solr-webapp/webapp/WEB-INF/lib/

创建数据库导入规则文件

进入到创建的 Core 的 conf 目录下,创建 db-data-phpbb-config.xml:

说明:使用 encryptKeyFile 加密密码暂未成功,待修正; 数据导入暂时也有问题,待修正。

关于删除部分的注解

  1. 有什么不正常的,看日志,很多错误都不直接展示,而是输出到日志的;位置:server/logs/solr.log
  2. JDBC 会把数据库中的 tinyint(1) 作为 boolean 值处理,从而返回 true/false;见指南7
<dataConfig>
    <dataSource type="JdbcDataSource" 
                driver="com.mysql.jdbc.Driver" 
                url="jdbc:mysql://localhost:3306/cloud_forum?tinyInt1isBit=false"
                user="cloud_comunity"
                password="U2FsdGVkX1+Dufhy3JpsUm27vCuEOQUxRBQ5cbJZv59JSihVJI02WURIQJHSj0++"
                encryptKeyFile="encryptionkey.txt"
                batchSize="-1" />
    <document>
       <entity name="posts" 
               pk="post_id"
               query="SELECT post_id, topic_id, forum_id, poster_id, post_time, post_subject, post_text, post_attachment, post_edit_time, post_visibility FROM ffdb_posts"
               deltaQuery="SELECT post_id FROM ffdb_posts WHERE post_edit_time > '${dataimporter.last_index_time}' OR post_delete_time > '${dataimporter.last_index_time}'"
               deltaImportQuery="SELECT post_id, topic_id, forum_id, poster_id, post_time, post_subject, post_text, post_attachment, post_edit_time, post_visibility FROM ffdb_posts WHERE post_id > '${dataimporter.delta.post_id}'"
               >
               
               <field column="post_id" name="post_id" />
               <field column="topic_id" name="topic_id" />
               <field column="forum_id" name="forum_id" />
               <field column="poster_id" name="poster_id" />
               <field column="post_time" name="post_time" />
               <field column="post_subject" name="post_subject" />
               <field column="post_text" name="post_text" />
               <field column="post_attachment" name="post_attachment" />
               <field column="post_edit_time" name="post_edit_time" />
               <field column="post_visibility" name="post_visibility" />

               <entity name="topic_first"
                       query="SELECT COUNT(*) AS is_first FROM ffdb_topics WHERE topic_id = '${posts.topic_id}' AND topic_first_post_id = '${posts.post_id}'" 
               >
                   <field column="is_first" name="is_first" />
               </entity>

              <entity name="topic_info"
                      query="SELECT topic_type, topic_visibility FROM ffdb_topics WHERE topic_id = '${posts.topic_id}'"
              >
                  <field column="topic_type" name="topic_type" />
                  <field column="topic_visibility" name="topic_visibility" />
              </entity>

             <entity name="poster_name"
                     query="SELECT username FROM ffdb_users WHERE user_id = '${posts.poster_id}'"
             >
                 <field column="username" name="poster_name" />
             </entity>
       </entity>
    </document>
</dataConfig>

上述部分字段解释:

  • dataSource 定义数据源的名称,可以定义多个,但要追加值唯一的 name 属性
  • entity 一张表对应的实体,可以嵌套的
  • pk 主键
  • query 查询语句
  • deltaQuery 增量索引,从数据库中根据指定的语句查询所有需要导入的数据ID,然后根据 deltaImportQuery 指定的 SQL 语句返回所有这些 ID 的数据
  • field 中的
    • column 数据库的字段名
    • name solr 定义的 Filed 名称

写入 solrconfig.xml

<requestHandler name="/select" class="solr.SearchHandler"> 之前添加:

 <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
     <lst name="defaults">
         <str name="config">db-data-phpbb-config.xml</str>
     </lst>
 </requestHandler>

重启服务

./bin/solr restart -m 1g -a "-Duser.timezone=Asia/Shanghai" -force

删除全部索引数据

在solr客户端,访问你的索引库(我认为最方便的方法)

1)documents type 选择 XML 2)documents 输入下面语句

<delete><query>*:*</query></delete>
<commit/>

参考

  1. Solr guide
  2. 搜索为将 – Solr使用教程
  3. Solr6.5配置中文分词器
  4. Solr DIH
  5. solr6 从mysql上导入数据
  6. solr deltaImportQuery deltaQuery parentDeltaQuery 用法规则
  7. Why does DIH convert my tinyint(1) columns to boolean values in Solr?