關於solr的一些總結和問題
今天是2018年的第一天,目前已經工作一年了,項目也在不斷的“升級”,寫的東西越來越多,偶爾總結一下,也算是一種學習吧。休息了幾天,今天把前段時間關於Solr的一些問題總結一下。
在之前自己搭過單機版的solr,網上教程很多,隨便百度一個就可以搭的很好,在實際運用中,我使用了Solr4.10.3(比較老,但是目前夠用)。
使用時的問題
- solr4.10.3中文分詞,不支持智能中文分詞
- 利用solrJ生成索引時多次報錯
- 利用solrJ生成索引時報錯對應的結果
- solrCloud搭建時與Zookeeper的搭配
- 利用url命令創建solrCloud的shards及replacations時,實際與想法不同
- 後續問題持續更新。。。
對問題的處理及記錄
- solr4.10.3目前不支持只能中文分詞(smar_ik),但是網上也有針對4.*的解決方案。目前是,修改了IK的jar(還沒有看修改了哪),再修改schema.xml(經測試,可以進行智能分詞,即分詞的粒度相對於之前的text_ik比較大)。後續有需要,我會嘗試研究修改的IK.jar。
修改之前:
<fieldType name="text_ik" class="solr.TextField">
<analyzer type="index" isMaxWordLength="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
<analyzer type="query" isMaxWordLength="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
修改之後:
<fieldType name="text_ik" class="solr.TextField"
positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="org.wltea.analyzer.lucene.IKAnalyzerSolrFactory" isMaxWordLength="false" />
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopword.dic" enablePositionIncrements="true" />
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
</analyzer>
<analyzer type="query">
<tokenizer class="org.wltea.analyzer.lucene.IKAnalyzerSolrFactory" isMaxWordLength="true" />
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopword.dic" enablePositionIncrements="true" />
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
</analyzer>
</fieldType>
<!-- 引用智能分詞 -->
<fieldType name="smart_ik" class="solr.TextField">
<analyzer >
<tokenizer class="org.wltea.analyzer.lucene.IKAnalyzerSolrFactory" isMaxWordLength="true" /><!-- 智能分詞 -->
</analyzer>
</fieldType>
<!-- 引用最細粒 -->
<fieldType name="tiny_ik" class="solr.TextField">
<analyzer >
<tokenizer class="org.wltea.analyzer.lucene.IKAnalyzerSolrFactory" isMaxWordLength="false" /><!-- 最細粒分詞 -->
</analyzer>
</fieldType>
2. 生成索引時,可以利用xml的形式,配置dataImport.xml來生成索引,由於1.數據量不是很大,2.而且數據的格式不是很規範(在數據的規範上有一定的問題)3.之前利用dataImport需要多次刷新。所以此時和java建立聯繫,利用SolrJ來生成索引。生成索引之前需要配置,schema.xml將需要的字段都寫在對應的位置。
例:
```
配置完成後:
配置時required這個屬性要注意,是否是唯一標識符,如果寫了是true,則在數據中必須不爲空,否則會報錯
比如導100條數據,如果第50條報錯,那麼其餘的99條會生成索引,只有第50條不會生成索引(此處應該注意,避免重複生成索引)
1. 由於導入的數據來自不同的表,所以不能使用id來作爲唯一標識(是否是自增,我還沒有測試,稍後更新),使用uuid來替代int類型。此時在修改(即添加操作,如果沒有則添加,有則修改,修改時對之前舊的需要保留的數據進行備份,否則以前的舊的屬性會被覆蓋,所以如果修改一個屬性,需要把另外幾個屬性都複製過來)或刪除時,需找到對應的uuid來進行操作
在刪除時:
```
UpdateResponse response = cloudSolrServer.deleteById("100002");
System.out.println(response.getQTime());
```
可能是版本不對應,response.getQTime()會報錯,刪掉就可以正常進行刪除操作。
4. solr單機版多個core比較不便於操作,如果使用solrClou則方便的多,而且速度有明顯的提升。我使用了,3個zookeeper和3個tomcat放SolrCloud,當時沒有多想,有這麼多服務器,就這麼搭配,後續如果需要再研究下性能問題,再來擴充。
5. 利用url命令創建solrCloud的shards及replacations時
http://localhost:8080/solr/admin/collections?action=CREATE&name=credit2&numShards=1&replicationFactor=1&createNodeSet=192.168.10.63:8080_solr,192.168.10.64:8080_solr,192.168.65:8080_solr
先執行一次,再執行一次,纔會生成,一個collections,三個shards,三個都是leader,沒有replaction,雖然可以使用,但是後續性能可能會有問題,如果需要再進行學習探索。
參考
《solr實戰》
總結
後續有機會我會更新上述問題沒有的問題,如果有錯誤的地方,或者可以幫我解決沒有解決的疑惑,qq:463782649,備註之後飛速回復。
進入2018年,也算是一個新的開始,希望在程序猿的道路上可以越來越好,夢想得有,萬一實現了呢。