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