1. 程式人生 > >solr學習筆記(二):進階

solr學習筆記(二):進階

    jetty啟動: wiki有教程;         實驗遇到的問題:1. 在windows上不同jetty帶起的solr例項註冊不到zk上。                                     2. 在虛擬機器啟動了2個shard,windows上的例項無法同步到已經啟動的shard上,曾以為是solr目錄檔案不一樣的問題,替換虛擬機器中的目錄到windows 下依然不行。     tomcat+獨立zookeeper:          1. 複製多份solr,和多份tomcat;配置單個solr執行在tomcat的例項(conf/Catalina/localhost/solr
.xml);注意如果在一臺機器上tomcat伺服器各種埠要避免重合!紅字solr表示url的path。
        2. 將collection的配置上傳到zk上: 利用 cloud-scripts目錄下的zkcli.sh指令碼          cloud-scripts/zkcli.sh -cmd upconfig -confdir ~/apache-solr-4.0.0/example/solr/collection1/conf/ -confname coll1 -z vm:2181         其中 -confdir 是上傳集合的配置, -z 配置ZK的服務地址,coll1會儲存在/configs下
        3. 在catalina.sh中加入JAVA_OPTS引數,JAVA_OPTS="-DzkHost=vm:2181" , 這是配置zk路徑的。 如果第一臺solr服務開始指定shard數量,還可以加入"-DnumShards=2",後續加入的機器可以不加這句         4. 啟動tomcat 和solr專案,在http://url/solr/#/~cloud中可以看到叢集情況 
        5. 經驗總結:
            5.1 如果不走第二步,那麼需要把配置上傳的語句(wiki中jetty啟動有),寫到tomcat的JAVA_OPTS裡             5.2 solr目錄下的solr.xml中幾個引數含義(只是註冊到ZK上的屬性,不影響使用,但點選cloud上的機器你就轉不到那了
):
                host:是註冊到zookeeper叢集的機器名.預設是機器名,可以改成機器的IP,那樣就免去了更改系統hosts檔案了.                 hostPort:註冊到zookeeper叢集的訪問該服務的埠號.(最好改成所在tomcat服務埠)                 hostContext:註冊到zookeeper叢集的訪問該伺服器的web例項名.預設是solr             5.3 如果首臺solr例項啟動不註明shard數量,那麼叢集中就1個shard後續所有例項都會註冊到這個上,形成replica。即,numShards:預設為1,(shard才是真正分散式搜尋的服務             5.4 zk會保留叢集註冊資訊,如果zk資料不刪除,solr再次啟動,還會處在相同配置上。
            5.5 如果開始只有一個shard,想熱部署一個新的shard, 可以再solr.xml的 core上配置一個shard="shard2" 屬性,啟動之後自動加入叢集之中。(這一步可以由5.6代替)
            5.6 複製一份collection1 到collection2, 在一臺solr例項中啟動,之後叢集可見,其他節點可以再管理後臺add core,(雲端的add core 比單點的要多兩個引數:collection和shard, 並且collection的schema和config都是zk上的路徑,因此第二步上傳配置是必須的。體現了叢集管理配置的特點,對應solr中ZkResourceLoader乾的事)形成新的分散式搜尋庫。可以為同一個collection增加不同shard
5.7 solrcloud 4.0 master slave轉換並沒有想象中可靠,一般剛上線的master/slave都是正常狀態,master掛機或者unload,slave多半變成等待恢復的狀態而不是轉為新master(master不在將不能進行寫操作); 再恢復原master,slave多半出現恢復失敗,但是當了新master。此時系統可用,任意一臺機器down都不會影響讀寫(就算剛才新的master也掛了,原master也能頂上當master),務必進行重建等必要措施。 5.8 5.7的問題在solrcloud4.1得到了解決,隨時停掉master  都能自動改變leader, 之前的還是不要了,新探索出4.3的部署,之前的路線更簡單一點:  1. 解壓solr-4.3.0, 把example拷貝出到新目錄solrbase, 執行java -jar start.jar 把jetty自帶的solr.war解壓出來(不執行這一步解壓不出solr所需要的所有lib,你以後要直接用cloud-script就不行) 2. 解壓tomcat, 放到solrbase下,在tomcat/conf新增Catalina/localhost/solr.xml ,xml裡新增如下內容: <Context docBase="/xxx/tomcat/webapps/solr.war" debug="0" crossContext="true" >            <Environment name="solr/home" type="java.lang.String" value="/xxx/solrbase/solr" override="true" />         </Context> 3.將solrbase/webapps/solr.war拷貝到tomcat/webapps 下,tomcat的server.xml配置可以根據需要修改,尤其注意URIEncoding  4. 拷貝solrbase/lib/* solrbase/resources/* 到tomcat/lib下(4.3才新增的要求) 5. 修改tomcat/bin/catalina.sh 新增類似JAVA_OPTS="-Dhost=vm -Dport=8080 -Dbootstrap_confdir=/data/solrbase/solr/collection1/conf -Dcollection.configName=collection1 -DzkHost=vm:2181/solr"   !注意幾個地方-Dhost 表示傳入JVM的系統引數host, 這個就是填充solrbase/solr/solr.xml中的幾個引數, 你可以先看看solrbase/solr/solr.xml <cores上面的幾個引數,然後通過JAVA_OPTS的-D來傳進來;指定zookeeper地址之後的/solr表示 solrcloud所需要的zk配置會放在/solr下,如果不指定,ZK根下會有一堆SOLR的各種配置;-Dbootstrap_confdir和 -Dcollection.configName=collection1 表示啟動會把前者的配置上傳到.../configs下,並且改名collection1,這是預設collection1例子所需要的配置,如果你不配置在這裡,手動傳上去也可以。 6. 打包solrbase 分發到其他機器上,啟動tomcat/bin/startup.sh 7. 建議在solrcloud上的建立索引操作用collection API而不是每個solr例項慢慢add core  如果在schema.xml 定義中不存在text field ,在啟動solr 時會出現下面的異常:org.apache.solr.common.SolrException: undefined field text。解決辦法:只要在schema.xml 檔案中增加一個text field ,這樣在啟動時就沒有異常了。

如下:

<field name="text" type="text" stored="false" indexed="false"/>

2. <分詞外掛>

    analyzer是tokenizer和filter的組合: 覆蓋public TokenStreamComponents createComponents(String fieldName, Reader reader) 方法,首先通過各種Tokenizer從reader中獲取tokenizer,給TokenFilter產生各種TokenStream result,再進行過濾.. 最後返回new TokenStreamComponents(tokenizer, result)

    TokenizerFactory 需要重寫Tokenizer create(Reader input)方法,smartcn直接返回了SentenceTokenizer

    TokenFilterFactory  需要重寫 TokenFilter create(TokenStream input)  smartcn直接返回了WordTokenFilter(input)

    上述兩個方法可以給solr在schema.xml上配置分詞的組合細節的,如果直接用analyzer,那就不用再xml中配置其他過濾器之類的。

    可能一般需要自己的TokenFilter(smartcn的WordTokenFilter比較好理解); 4.0和3.0比在介面上有些許不同 需要特別留意。

    IK分詞器中並沒有TokenFilter 概念,而是在Tokenizer 中直接完成分詞過程(注意Tokenizer 和TokenFilter 都需要覆蓋的是boolean incrementToken()方法,並在類裡面保留當前token資訊)

    solr的分詞基本與lucene的分詞結構一致,多了直接暴露分詞器核心的Factory

    分片語建實現了ResourceLoaderAware的XXXFactory的路徑由SolrResourceLoader控制,如果想動態載入詞典,就在inform(ResourceLoader loader)中啟動監控執行緒即可。 3. solrj開發     HttpSolrServer server = new HttpSolrServer(url);     可以Pojo形式建文件
    HttpSolrServer 核心包裝了一個httpClient,會對請求結果根據responseWriter進行再次解析.

     請求方面: