Solr 安装配置指南
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 加密密码暂未成功,待修正; 数据导入暂时也有问题,待修正。
关于删除部分的注解
- 有什么不正常的,看日志,很多错误都不直接展示,而是输出到日志的;位置:server/logs/solr.log
- 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/>