solrCloud叢集搭建(solr-6.5.1,zookeeper-3.4.10)
Solr 是一個基於 Apache Lucene 之上的搜尋伺服器,它是一個開源的、基於 Java 的、執行在Servlet容器(如Apache Tomcat或Jetty)的資訊檢索庫。它旨在驅動功能強大的文件檢索應用程式 - 無論您需要根據使用者的查詢將資料服務到何處,Solr 都可以為您服務。
下面是一個如何將 Solr 整合到應用程式中的示例:
採用偽叢集部署方式,在同一臺伺服器上部署3個zookeeper,3個solr服務。結構如下圖:
1,下載壓縮包,zookeeper,solr
2,部署zookeeper叢集,(部署單個,拷貝多個)
3,solr部署
solr-6.5.1.tgz解壓命名為solr-1
4,solr關聯zookeeper
配置solr和zookeeper,在solr-1/bin 目錄下 ,solr.in.sh檔案中,加入如下引數,並複製solr-1,貼上為solr-2,solr-3。
ZK_HOST="10.1.88.101:2281,10.1.88.101:2282,10.1.88.101:2283"
5,更改solr-2,solr-3的啟動埠
因為是在同一臺機器上部署,所以要更改各個solr節點的預設啟動埠。以solr-1為例,預設是8983,我改為8985.
/srv/new_solr/solrCloud/solr-1/bin 目錄下的 solr.in.sh 檔案
SOLR_PORT=8985
/srv/new_solr/solrCloud/solr-1/server/etc 目錄下的 jetty-https.xml檔案
<Set name="port"><Property name="solr.jetty.https.port" default="8985" /></Set>
執行啟動命令
/srv/new_solr/solrCloud/solr-1/bin/./solr start
solr-2,solr-3也是一樣
啟動成功後,進入一個節點,我的是 http://10.1.88.101:8985/solr/#/ 左側能看到Cloud選單,即是Cloud模式
6,建立collection的配置檔案並上傳。
我的配置檔案是myconf,這個可以從/srv/new_solr/solrCloud/solr-1/server/solr/configsets/ 下複製sample_techproducts_configs 資料夾到solr-1的根目錄,命名為myconf,作為要建立的collection的配置檔名。
cp -rf /srv/new_solr/solrCloud/solr-1/server/solr/configsets/sample_techproducts_configs/* /srv/new_solr/solrCloud/solr-1/myconf
進入/srv/new_solr/solrCloud/solr-1/server/scripts/cloud-scripts 目錄,利用./zkCli.sh 上傳solr的配置檔案到zookeeper,如下命令,myconf是要上傳的配置檔名,file_bank是上傳後的顯示名。
cd /srv/new_solr/solrCloud/solr-1/server/scripts/cloud-scripts/
./zkcli.sh -zkhost 10.1.88.101:2281,10.1.88.101:2282,10.1.88.101:2283 -cmd upconfig -confdir /srv/new_solr/solrCloud/solr-1/myconf/ -confname file_bank
7,建立collections
上傳成功後,在solr 後臺建立collection時可以看到之前命名的配置檔案file_bank。
建立時引數解析
name:將被建立的集合的名字
numShards:集合建立時需要建立邏輯碎片的個數
replicationFactor:分片的副本數。replicationFactor(複製因子)為 3 意思是每個邏輯碎片將有 3 份副本。
maxShardsPerNode:預設值為1,每個Solr伺服器節點上最大分片數(4.2新增的)
注意三個數值:numShards、replicationFactor、liveSolrNode(當前存活的solr節點),一個正常的solrCloud叢集不容許同一個liveSolrNode上部署同一個shard的多個replic,因此當maxShardsPerNode=1時,numShards*replicationFactor>liveSolrNode時,報錯。因此正確時因滿足以下條件:numShards*replicationFactor<liveSolrNode*maxShardsPerNode
如有錯誤collections,執行刪除語句
http://10.1.88.101:8985/solr/admin/collections?action=DELETE&name=file_bank
8,分詞器配置,我選的是smart分詞,這個lucene-analyzers-smartcn-6.5.1.jar包是在/srv/new_solr/solrCloud/solr-1/contrib/analysis-extras/lib下,所以修改solrconfig.xml,新增分詞器jar包位置
<lib dir="${solr.install.dir:../../../..}/contrib/analysis-extras/lucene-libs" regex=".*\.jar" />
修改manged-schema.xml,增加一個新的fileType 型別,並指定分詞型別是smart
<fieldType name="text_smart" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
</analyzer>
<analyzer type="query">
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
</analyzer>
</fieldType>
建立一個新的field 命名為 file_text_search_all ,並將需要分詞的欄位copy進來。
<field name="file_text_search_all" type="text_smart" indexed="true" stored="true" multiValued="true" />
<!-- 為多個field指定一個共同的別名,通過這個別名進行query就能夠同時對所有field進行搜尋 -->
<copyField source="fileBank_teacherName_s" dest="file_text_search_all"/>
<copyField source="fileBankName_s" dest="file_text_search_all"/>
<copyField source="fileSchoolName_s" dest="file_text_search_all"/>
<copyField source="fileMajorName_s" dest="file_text_search_all_s"/>
<copyField source="fileSubjectName_s" dest="file_text_search_all"/>
<copyField source="fileTypeName_s" dest="file_text_search_all"/>
<copyField source="fileYear_s" dest="file_text_search_all"/>
9,更新配置檔案,每次修改manage-schema,都需要執行上傳操作,即下述命令
cd /srv/new_solr/solrCloud/solr-1/server/scripts/cloud-scripts/
./zkcli.sh -zkhost 10.1.88.101:2281,10.1.88.101:2282,10.1.88.101:2283 -cmd upconfig -confdir /srv/new_solr/solrCloud/solr-1/myconf/ -confname file_bank
10,檢視分詞示例
collection選擇file_bank,在Analysis選單中,選擇file_text_search_all 欄位,輸入待分詞文字
分詞結果如下
11,配置停詞表,stopwords.txt
12,solrj的使用
連線SolrCloud,建立CloudSolrClient
13,批量建立時提高提交速度,設定軟提交,硬提交
<autoCommit>
<maxTime>${solr.autoCommit.maxTime:15000}</maxTime>
<maxDocs>100000</maxDocs>
<openSearcher>false</openSearcher>
</autoCommit>
<autoSoftCommit>
<maxTime>${solr.autoSoftCommit.maxTime:15000}</maxTime>
<maxDocs>10000</maxDocs>
</autoSoftCommit>
14,使用中遇到問題---相似度演算法
solr6.5的變化
託管模式現在是預設的
當 solrconfig.xml 沒有明確定義 <schemaFactory/> 的時候,Solr 的預設行為現在依賴於 solrconfig.xml 定義的 luceneMatchVersion。當 luceneMatchVersion < 6.0 時,ClassicIndexSchemaFactory 將繼續用於後向相容,否則將使用 ManagedIndexSchemaFactory 的例項。
這種變化最顯著的影響是:
- 現有的 solrconfig.xml 檔案被修改為使用 luceneMatchVersion >= 6.0,但沒有明確配置 ClassicIndexSchemaFactory,將其 schema.xml 檔案自動升級到managed-schema 檔案。
- 現在將預設啟用通過 Schema API 進行的模式修改。
預設的相似性改變
當 Schema 沒有明確地定義全域性 <similarity/> 時,Solr 的預設行為將依賴於 solrconfig. xml 中指定的 luceneMatchVersion。當 luceneMatchVersion < 6.0 時,將使用 ClassicSimilarityFactory 的例項,否則將使用 SchemaSimilarityFactory 的例項。最值得注意的是,這種改變意味著使用者可以利用每個欄位型別的相似性宣告,並且需要明確宣告 SchemaSimilarityFactory 的全域性用法。
無論是明確宣告還是作為隱式全域性預設值使用,當欄位型別不宣告明確 <similarity/> 時,SchemaSimilarityFactory 的隱式行為也被更改為依賴於 luceneMatchVersion。當 luceneMatchVersion < 6.0 時,將使用 ClassicSimilarity 的例項,否則將使用 BM25Similarity 的例項。可以在 SchemaSimilarityFactory 宣告中指定 defaultSimFromFieldType init 選項來更改此行為。請檢視 SchemaSimilarityFactoryjavadocs 瞭解更多詳情
TF---詞頻 標題分詞 1/100
IDF---逆向檔案頻率 命中率 log(1000/10)=2
TF*IDF=0.02
搜尋(好人做小事)
做大好事
我大好人
做好事
好人
做大事
好人小事是大事
小 (3*1)
。
。