1. 程式人生 > >solrCloud叢集搭建(solr-6.5.1,zookeeper-3.4.10)

solrCloud叢集搭建(solr-6.5.1,zookeeper-3.4.10)

Solr 是一個基於 Apache Lucene 之上的搜尋伺服器,它是一個開源的、基於 Java 的、執行在Servlet容器(如Apache TomcatJetty)的資訊檢索庫。它旨在驅動功能強大的文件檢索應用程式 - 無論您需要根據使用者的查詢將資料服務到何處,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)