docker下solr6.6的中文分词配置

git clone https://github.com/docker-solr/docker-solr
目前是有以下文件:

5.5  7.2      Docker-FAQ.md               Dockerfile.template            known_keys.txt  README.md         TAGS   update.md
6.6  7.3      Dockerfile-alpine.template  docs                           LICENSE         README-short.txt  tests
7.1  builder  Dockerfile-slim.template    generate-stackbrew-library.sh  logo.png        scripts           tools

在6.6里找到Dockerfile,做改动去掉solr用户启动服务,以root启动:
#USER $SOLR_USER
USER root

接下来build,先生成一个镜像:
docker build -t solr:tmp .

准备中文分词的jar包文件,下载地址:http://www.moneyslow.com/soft/ikanalyzer-solr5.tar.gz
创建一个目录 /data/solr/ikanalyzer-solr5 ,解压后(test目录是一个可以用的实例目录,可以忽略它,后面也会有创建实例的例子):

-rw-r--r--. 1 root root      41 Jun  5  2016 ext.dic
-rw-r--r--. 1 root root     404 Jun  5  2016 IKAnalyzer.cfg.xml
-rw-r--r--. 1 root root 1167537 Jun  5  2016 ik-analyzer-solr5-5.x.jar
-rw-r--r--. 1 root root     912 Mar 31  2017 solr-analyzer-ik-5.1.0.jar
-rw-r--r--. 1 root root    8245 Jun  5  2016 stopword.dic
drwxr-xr-x. 4 root root      53 Jun 20 04:30 test

启动一个临时容器,挂载有jar包的宿主机目录:
docker run --name tmpsolr -d -p 8983:8983 -v /data/solr/ikanalyzer-solr5:/data/solr/ikanalyzer-solr5 solr:tmp

进入容器:

改一下内存配置,默认的512太小:
/opt/solr/bin/solr.in.sh文件,SOLR_HEAP="4096m"

拷贝挂载的宿主机目录的文件:
cp /data/solr/ikanalyzer-solr5/*.jar /opt/solr/server/solr-webapp/webapp/WEB-INF/lib/
cp /data/solr/ikanalyzer-solr5/*.dic /opt/solr/server/solr-webapp/webapp/WEB-INF
cp /data/solr/ikanalyzer-solr5/*.xml /opt/solr/server/solr-webapp/webapp/WEB-INF

在宿主机上把所有的修改提交成新镜像
docker commit -m "solr china" -a "moneyslow.com" 902e55368966 solr:chinese

至此为止我们已经有了新镜像solr:chinese,先别着急,因为我们要把实例的数据进行保存,所以要在现有的容器里按照官方的例子文件做一个新的实例,然后把它拷贝到宿主机。

进入容器(新建自己的实例目录moneyslow):

cp -r /opt/solr/example/example-DIH/solr/solr /opt/solr/server/solr/moneyslow

修改solrconfig.xml文件,配置实例需要的jar包

大概在86行,添加分词需要的jar
<lib dir="${solr.install.dir:../../../..}/contrib/analysis-extras/lib" regex=".*\.jar" />
<lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-analysis-extras-\d.*\.jar" />
修改managed-schema文件,修改field信息为与自己的实体类相同的样子(添加field、添加copyField),添加IK分词器配置,在文档最后面(</schema>之前)添加如下(意思为text_ik类型字段进行索引时使用ik分词器,并且进行拼音分词,进行查询时只使用ik进行中文分词)

<!--IK-->
<fieldType name="text_ik" class="solr.TextField">
<analyzer type="index">
<tokenizer class="org.apache.lucene.analysis.ik.IKTokenizerFactory" useSmart="false"/>
<!-- 因为我没有拼音分词的jar包,所以下面两行注释掉,如果有可以加上
<filter class="org.apache.lucene.analysis.pinyin.solr5.PinyinTokenFilterFactory" firstChar="false" minTermLength="2" />
<filter class="org.apache.lucene.analysis.pinyin.solr5.PinyinNGramTokenFilterFactory" nGramChinese="false" nGramNumber="false" />
-->
</analyzer>
<analyzer type="query">
<tokenizer class="org.apache.lucene.analysis.ik.IKTokenizerFactory" useSmart="false"/>
</analyzer>
</fieldType>

这样自己的实例目录就做好了,拷贝到宿主机:
cp -r /opt/solr/server/solr/moneyslow /data/solr/ikanalyzer-solr5/

关掉临时容器:
docker stop tmpsolr

重新以新镜像启动容器(挂载宿主机目录/data/solr/ikanalyzer-solr5):
docker run  --name moneyslow --restart=always -d -p 8983:8983 -v /data/solr/ikanalyzer-solr5:/opt/solr/server/solr solr:chinese

其他配置(可选)

solrConfig.xml文件中可进行下述修改

1、修改自动提交
(solr中数据索引后需要commit才能真正持久保存,我最早使用代码进行主动commit,后来发现太慢,改为使用autoCommit)
autoCommit分两类,一个是真正commit索引数据存入文件,慢但是安全,一个是软commit索引数据存入内存或临时文件,快但是不安全。调整配置的数据取到一个平衡点可以有效提高效率。

#1万条或者5分钟提交一次,关闭重新打开searcher(提高commit速度),1分钟软提交一次

<autoCommit> 
<maxDocs>10000</maxDocs>
<maxTime>300000</maxTime> 
<openSearcher>false</openSearcher> 
</autoCommit>

<autoSoftCommit> 
<maxTime>60000</maxTime> 
</autoSoftCommit>

2、修改提交限制

和autoCommit配合使用,防止大量数据批量导入时内存溢出或者操作超时。
#50M数据或者1000个最大缓存个数
<ramBufferSizeMB>50</ramBufferSizeMB>
<maxBufferedDocs>1000</maxBufferedDocs>

3、最大可启动searcher

solr每次提交时,都会新打开一个searcher,打开searcher需要花费一定时间,在这个过程中,如果又有新的commit提交,又会打开新的searcher。当数量超过SolrConfig.xml中配置的maxWarmingSearchers时,会报错。
maxWarmingSearchers配置的是同时可以存在的searcher个数。

#由2改为4
<maxWarmingSearchers>4</maxWarmingSearchers>

参考:
https://www.cnblogs.com/zhangyuan0532/p/6306936.html
https://www.cnblogs.com/shaosks/p/8204615.html

京ICP备11047313号-19 彩虹岛电子书