關於solr的一些總結和問題

在這裏插入圖片描述
關於solr的一些總結和問題

今天是2018年的第一天,目前已經工作一年了,項目也在不斷的“升級”,寫的東西越來越多,偶爾總結一下,也算是一種學習吧。休息了幾天,今天把前段時間關於Solr的一些問題總結一下。

在之前自己搭過單機版的solr,網上教程很多,隨便百度一個就可以搭的很好,在實際運用中,我使用了Solr4.10.3(比較老,但是目前夠用)。

使用時的問題

  1. solr4.10.3中文分詞,不支持智能中文分詞
  2. 利用solrJ生成索引時多次報錯
  3. 利用solrJ生成索引時報錯對應的結果
  4. solrCloud搭建時與Zookeeper的搭配
  5. 利用url命令創建solrCloud的shards及replacations時,實際與想法不同
  6. 後續問題持續更新。。。

對問題的處理及記錄

  1. 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年,也算是一個新的開始,希望在程序猿的道路上可以越來越好,夢想得有,萬一實現了呢。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章