建立solr7.3.0集羣_測試集羣_添加中文分詞器_導入數據

solr是apache下的一個用於作搜索引擎的高級項目,使用它能夠知足絕大部分應用的搜索需求。html

主機環境:

​ Linux:centos6.5java

​ JDK:1.8node

​ solr:7.3.0mysql

​ zookeeper:3.4.8linux

​ mmseg4j-solr:2.4.0git

1. 建立與啓動solr集羣

使用三臺虛擬機模擬建立solr集羣github

IP 名稱  
192.168.245.128 APP1  
192.168.245.129 APP2  
192.168.245.130 APP3  

下載solr-7.3.0.tgzweb

下載地址1: http://mirror.bit.edu.cn/apache/lucene/solr/7.3.0/sql

下載地址2:https://github.com/apache/lucene-solr/releases/tag/releases%2Flucene-solr%2F7.3.0數據庫

將包上傳到linux主機上,執行命令提取安裝腳本

--將壓縮包中的install_solr_service.sh提取出來
tar xzf solr-7.3.0.tgz solr-7.3.0/bin/install_solr_service.sh --strip-components=2

執行安裝腳本(必須安裝JDK)

sudo bash ./install_solr_service.sh solr-7.3.0.tgz -i /home/solr/proc/solr -d /home/solr/data/solr -u solr -s solr -p 8983

-i: solr安裝目錄

-d:solr實時文件目錄

-u:爲solr建立的操做系統用戶名

-s:開機啓動服務名稱

-p:監聽端口

 

若是安裝並設置了環境變量後還報JAVA_HOME找不到的話能夠參考以下步驟操做,不然忽略這一步:

#使用root用戶編輯/etc/profile,在文件最後添加jdk相關的信息
   export JAVA_HOME=/home/jionsvolk/proc/jdk1.8.0_65
   export JAVA_BIN=$JAVA_HOME/bin
   export PATH=$PATH:$JAVA_HOME/bin
   CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
   export JAVA_HOME JAVA_BIN PATH CLASSPATH
​
#在當前用戶主目錄下編輯.bashrc文件
    vi .bashrc
    添加:alias sudo='sudo env PATH=$PATH'
   
#修改sudo默認配置
    sudo visudo
    # Defaults env_reset     # 註釋掉原有配置
    # Defaults env_keep=」…」     # 註釋掉指定的變量保持
    Defaults !env_reset     # 修改成不重置環境
    或者
    Defaults env_reset
    Defaults env_keep="JAVA_HOME"

重啓主機,再次執行solr安裝腳本install_solr_service.sh

由於solr自帶有jetty容器,就沒有部署到tomcat中了,並且也已經設置爲開機啓動。若是想部署到tomcat能夠將solr安裝目錄下/server/solr-webapp/下面的內容複製過去

 

安裝與配置zookeeper集羣

下載zookeeper-3.4.8

下載地址1:http://mirror.bit.edu.cn/apache/zookeeper/

下載地址2:https://github.com/apache/zookeeper/releases

上傳到linux主機,並解壓

tar -xf zookeeper-3.4.8

修改配置文件

cd /home/solr/proc/zookeeper-3.4.8/conf
cp zoo_sample.conf zoo.conf
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/home/solr/data/zookeeper
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
server.1 = 192.168.245.128:2888:3888
server.2 = 192.168.245.129:2888:3888
server.3 = 192.168.245.130:2888:3888

其中dataDir 和 server.x 須要修改,clientPort=2181端口是solr在down和upload配置文件時使用的端口

在各個主機上的zookeeper數據文件目錄下建立一個myid文件,裏面存放對應主機的server.x中的x數字,好比server.1 = 192.168.245.128:2888:3888,那麼192.168.245.128主機上myid文件中就寫1

每臺機器上啓動zookeeper和solr

#在solr用戶下操做
cd /home/solr/proc/zookeeper-3.4.8/bin
./zkServer.sh start
./zkServer.sh status
#在root用戶下操做
service solr stop
service solr start

若是看到Leader或者Follower字樣就表示zookeeper集羣建立成功

備註:建議修改這部分設置

*** [WARN] *** Your open file limit is currently 10240.  
It should be set to 65000 to avoid operational disruption.
If you no longer wish to see this warning, set SOLR_ULIMIT_CHECKS to false in your profile or solr.in.sh
*** [WARN] ***  Your Max Processes Limit is currently 1024.
It should be set to 65000 to avoid operational disruption.
If you no longer wish to see this warning, set SOLR_ULIMIT_CHECKS to false in your profile or solr.in.sh
Waiting up to 180 seconds to see Solr running on port 8983 [\]  
Started Solr server on port 8983 (pid=6011). Happy searching!

上面的warning能夠在/etc/security/limits.conf中修改打開文件數限制爲

* soft nofile 65000
* hard nofile 65000

或者根據上面的建議,在solr.in.sh中設置SOLR_ULIMIT_CHECKS=false

zookeeper設置爲開機啓動

在上面的步驟設置完以後,每次重啓虛擬機只有solr是啓動了的,而後本身手工再啓動zookeeper,solr是不能訪問的,要求zookeeper集羣先於solr集羣啓動,所以在設置zookeeper集羣開機啓動前要先查看solr開機啓動的優先級

查看solr開機啓動的優先級

在執行這一步操做時,有興趣的老鐵能夠先看 Linux開機啓動一些知識點 的一片文章,瞭解rcx.d文件目錄的做用

cd /etc/rc3.d

ls *solr*

"S50solr"分析:

S:表明啓動

50:表明啓動的順序,值越小越先啓動

solr:服務名字,就是/etc/init.d中的文件名

因zookeeper要先於solr啓動,因此它的啓動順序對應的值應該小於50

設置zookeeper開機啓動
 

cd /etc/init.d

touch zookeeper

vim zookeeper

將下面的內容粘貼到zookeeper文件中

#!/bin/bash
#chkconfig:2345 20 90
#description:zookeeper
#processname:zookeeper
export JAVA_HOME=/home/jionsvolk/proc/jdk1.8.0_65
export ZOO_LOG_DIR=/home/solr/data/zookeeper/logs
case $1 in
        start) su solr /home/solr/proc/zookeeper-3.4.8/bin/zkServer.sh start;;
        stop) su solr /home/solr/proc/zookeeper-3.4.8/bin/zkServer.sh stop;;
        status) su solr /home/solr/proc/zookeeper-3.4.8/bin/zkServer.sh status;;
        restart) su solr /home/solr/proc/zookeeper-3.4.8/bin/zkServer.sh restart;;
        *) echo "require start|stop|status|restart" ;;
esac

其中chkconfig:2345 20 90很是重要

2345:爲主機運行的級別,表示主機運行在二、三、四、5個級別時都會啓動zookeeper,而0 、一、6級別時中止zookeeper

20:開機啓動的優先級,要比solr的50大

90:關機中止的順序

通常設置時,先啓動,則後中止,注意不要把啓動值設置得過小,不然可能一些系統核心服務尚未啓動起來,致使你的應用沒法啓動

JAVA_HOME是必須的

ZOO_LOG_DIR是可選的,用於保存zookeeper啓動時的日誌文件,我把它指定到了自定義目錄,不然你得使用root用戶啓動zookeeper或者給root用戶根目錄的寫權限授予給zookeeper的啓動用戶

chmod +x zookeeper

啓動zookeeper

service zookeeper start

設置爲開機啓動

chkconfig --add zookeeper

而後去/etc/rc3.d中查看zookeeper的啓動順序

查看zookeeper的中止順序

重啓主機,驗證solr的瀏覽器控制檯是否能夠訪問

2. 建立mycloud鏈接

./solr create -c mycloud -n mycloud -shards 4 -replicationFactor 2 -p 8983

在8983這個solr實例上建立一個鏈接mycloud,有四個shards(分片) ,每一個shards有兩個replicationFactor(複製品)

3. 在瀏覽器查看新建鏈接狀況

能夠看到下圖

還能夠點擊tree,查看zookeeper中的關於solr的配置信息,這些配置信息是從默認的配置文件目錄中讀取的

/home/solr/proc/solr/solr-7.3.0/server/solr/configsets/_default

4. 建立本身配置文件目錄

4.1 導出配置

./solr zk downconfig -z 192.168.245.130:2181 -n mycloud -d /home/solr/proc/solr/solr-7.3.0/myconfig/mycloud/conf

到對應目錄下查看已導出的文件,只須要在一臺機器上導出來,修改再上傳便可

4.2 修改配置(添加中文分詞器)

例如在managed-schema.xml(solr雲的配置文件)或者schema.xml(單實例solr的配置文件)裏面添加中文分詞器mmseg4j或者ik-analyzer

<fieldtype name="textComplex" class="solr.TextField" positionIncrementGap="100">
     <analyzer>
       <!--
           中文分詞器 其中dicPath是指定自定義分詞的目錄
           1.默認目錄爲啓動命令所在目錄下的data/wordsxxx.dic文件
           2.絕對路徑下的wordsxxx.dic文件
           3.solr_home下的wordsxxx.dic文件
       -->
       <tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="complex" dicPath="/home/solr/proc/solr/solr-7.3.0/myconfig/mycloud/conf"/>
     </analyzer>
   </fieldtype>
   <fieldtype name="textMaxWord" class="solr.TextField" positionIncrementGap="100">
     <analyzer>
       <tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="max-word" />
     </analyzer>
   </fieldtype>
   <fieldtype name="textSimple" class="solr.TextField" positionIncrementGap="100">
     <analyzer>
       <tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="simple"/>
     </analyzer>
   </fieldtype>
   <!-- myname是document對象中的字段名,表示doc中myname使用textComplex字段類型,該類型使用mmseg4j中文分詞器,indexed=true 表示須要創建索引 stored=true 表示須要存儲到索引文件中 -->
   <field name="myname"  type="textComplex"  indexed="true"  stored="true"></field>

增長了中文分詞器,必定要將相應的jar包上傳到solr_install_home下的server/solr-webapp/webapp/WEB-INF/lib目錄中,好比我添加的是mmseg4j分詞器,那麼須要將mmseg4j-core-1.10.0.jar和mmseg4j-solr-2.4.0.jar添加該目錄中

注:中文分詞器跟不上solr的更新速度,因此使用的時候最好去對應的分詞器官博或者githup上看看適配狀況,好比mmseg4j的githup上目前適配到的solr最高版本爲6.3.0(通過測試目前的7.3.0也是支持的)。

地址:https://github.com/chenlb/mmseg4j-solr

對schema.xml的全部配置能夠參考官方文檔https://lucene.apache.org/solr/guide/7_3/documents-fields-and-schema-design.html,裏面很是有用的CopyingField和DynamicField等等

 

在solrconfig.xml中添加中文分詞器動態加載handler

<requestHandler name="/mmseg4j/reloadwords" class="com.chenlb.mmseg4j.solr.MMseg4jHandler">  
       <lst name="defaults">  
            <!-- 若是solrcloud是多臺機器須要注意相同的配置目錄 -->
           <str name="dicPath">/home/solr/proc/solr/solr-7.3.0/myconfig/mycloud/conf</str>  
           <str name="check">true</str>  
           <str name="reload">true</str>  
       </lst>  
 </requestHandler>

須要重啓solr

service solr stop
service solr start

 

4.3 從新加載配置

能夠經過瀏覽器控制頁面查看從新加載前的配置文件內容

執行命令從新加載文件

./solr zk upconfig -z 192.168.245.130:2181 -n mycloud -d /home/solr/proc/solr/solr-7.3.0/myconfig/mycloud/conf

在瀏覽器中從新查看配置文件是否有變化

能夠看到中文分詞器的設置已經加載成功

寫一段代碼測試中文分詞器

@Test
    public void test3() throws Exception {
        final String solrUrl = "http://192.168.245.130:8983/solr/mycloud";
        HttpSolrClient client = new HttpSolrClient(solrUrl);
​
        FieldAnalysisRequest request = new FieldAnalysisRequest();
        request.addFieldName("myname");// 字段名,隨便指定一個支持中文分詞的字段
       request.setFieldValue("");// 字段值,能夠爲空字符串,可是須要顯式指定此參數
       request.setQuery("能夠看到中文分詞器的設置已經加載成功");
       
       FieldAnalysisResponse response = request.process(client);
       Iterator<AnalysisPhase> it = response.getFieldNameAnalysis("myname").getQueryPhases().iterator();
       while(it.hasNext()) {
           AnalysisPhase pharse = (AnalysisPhase)it.next();
           List<TokenInfo> list = pharse.getTokens();
           for (TokenInfo info : list) {
               System.out.println(info.getText());
           }
         }
    }

輸出結果:

分詞結果中沒有「分詞器」這個詞語,可使用mmseg4j的自定義分詞功能

Dictionary.java中的loadDic方法部份內容

File[] words = listWordsFiles();    //只要 wordsXXX.dic的文件
        if(words != null) { //擴展詞庫目錄
            for(File wordsFile : words) {
                loadWord(new FileInputStream(wordsFile), dic, wordsFile);
​
                addLastTime(wordsFile); //用於檢測是否修改
            }
}

因此/home/solr/proc/solr/solr/mydic建立一個words_1.dic,裏面添加"分詞器"三個字,一個詞一行

動態加載分詞

使用curl在執行語句,一臺物理機有一條語句便可,不須要每一個shard-replica都要照顧到:

其中mycloud_shard1_replica1的規則是:鏈接名稱-shard名稱-replica名稱,參考下圖中粗框圈出來的內容

curl 'http://192.168.245.129:8983/solr/mycloud_shard1_replica1/mmseg4j/reloadwords?wt=json'
curl 'http://192.168.245.130:8983/solr/mycloud_shard1_replica3/mmseg4j/reloadwords?wt=json'
curl 'http://192.168.245.128:8983/solr/mycloud_shard2_replica4/mmseg4j/reloadwords?wt=json'

最好在到主機上執行一次該命令,讓自定義分詞當即生效

curl 'http://192.168.245.128:8983/solr/admin/collections?action=RELOAD&name=mycloud'

 

再驗證結果:

5. 測試集羣

鏈接192.168.245.128,使用solrj客戶端API將數據添加到集羣中

測試代碼:

public void test2() throws Exception {
        final String solrUrl = "http://192.168.245.128:8983/solr";
        HttpSolrClient client = new HttpSolrClient(solrUrl);
​
        final SolrInputDocument doc = new SolrInputDocument();
        doc.addField("id", UUID.randomUUID().toString());
        doc.addField("myname", "梅西又當爹了,兒子還叫C羅");
​
        final UpdateResponse updateResponse = client.add("mycloud", doc);
        //NamedList<?> ns = updateResponse.getResponse();
        // Indexed documents must be committed
        client.commit("mycloud");
    }

 

鏈接192.168.245.130,使用瀏覽器查詢數據

http://192.168.245.130:8983/solr/mycloud/select?q=*:*

請C羅球迷不要多想

鏈接192.168.245.129,使用瀏覽器查詢數據

http://192.168.245.129:8983/solr/mycloud/select?q=*:*

請C羅球迷不要多想

從測試結果看,不管 鏈接那臺機器,查詢的結果都是一致的

6. 從數據庫中導入索引

6.1 配置數據導入處理器

在solrconfig.xml最後添加以下配置

<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
      <lst name="defaults">
        <!-- 數據源配置文件名自定義 -->
        <str name="config">mysql_db_import_config.xml</str>
      </lst>
    </requestHandler>

 

6.2 配置數據源

配置mysql_db_import_config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
   <dataSource driver="com.mysql.jdbc.Driver" url="jdbc:mysql://192.168.245.1:3306/study" user="root" password="12340101"/>
   <document>
       <entity name="account" query="select * from account">
           <field column="acct_id" name="acct_id_i" />
           <field column="acct_name" name="acct_name_t" />
           <field column="cust_id" name="cust_id_i" />
       </entity>
   </document>
</dataConfig>

其中的acct_id_id規則是xxxx_xx_i,其實就是manage-schema中的動態屬性dynamicField,如:

<dynamicField name="*_i"  type="pint"    indexed="true"  stored="true"/>

這是solr默認給咱們配置的一些可用屬性

 

重要1:將solr_home/dist/下的solr-dataimporthandler-7.3.0.jar複製到solr_home/server/solr-webapp/webapp/WEB-INF/lib目錄下

重要2:將修改後的配置文件上傳到集羣中一臺主機,而後執行配置上傳命令

重要3:重啓solr,若是有報錯的話,把zookeeper和solr前後重啓一遍

6.3 在瀏覽器控制檯導入數據

打開瀏覽器控制檯

點擊「Execute」

或者使用curl執行

curl "http://192.168.245.130:8983/solr/dataimport?command=full-import&clean=true&offset=0&length=10000&indent=on"

執行到這一步的時候可能會失敗:好比你數據庫配置有誤,或者網絡不通、防火牆沒有關閉、MYSQL的非本機訪問沒有打開之類的問題。

 

更完整的數據導入配置能夠參考http://lucene.apache.org/solr/guide/7_3/uploading-structured-data-store-data-with-the-data-import-handler.html#uploading-structured-data-store-data-with-the-data-import-handler

 

在實際生產中,本身用solrj簡單寫一個框架(好比像mybatis配合jpa所採用的方式)來導入數據庫中的各類表比上面的方式更方便靈活

7. 在Tomcat中啓動solr(此部分是轉載)

建立目錄

[root@node004 ]# mkdir -p /usr/local/solrCloud

複製單節點

[root@node004 ~]# cp /usr/local/solr /usr/local/solrCloud/solr1 -rf

[root@node004 ~]# cp /usr/local/solr /usr/local/solrCloud/solr2 -rf

[root@node004 ~]# cp /usr/local/solr /usr/local/solrCloud/solr3 -rf

[root@node004 ~]# cp /usr/local/solr /usr/local/solrCloud/solr4 -rf

注意:刪除每一個solrhome實例目錄下的core.properties

[root@node004 ~]# rm /usr/local/solrCloud/solr1/home/jonychen/core.properties -rf[root@node004 ~]# rm /usr/local/solrCloud/solr2/home/jonychen/core.properties -rf[root@node004 ~]# rm /usr/local/solrCloud/solr3/home/jonychen/core.properties -rf[root@node004 ~]# rm /usr/local/solrCloud/solr4/home/jonychen/core.properties -rf

solr中的配置文件

solr.xml

[root@node004 ~]# vi /usr/local/solrCloud/solr1/home/solr.xml

 

[root@node004 ~]# vi /usr/local/solrCloud/solr2/home/solr.xml [root@node004 ~]# vi /usr/local/solrCloud/solr3/home/solr.xml [root@node004 ~]# vi /usr/local/solrCloud/solr4/home/solr.xml

tomcat中的配置文件

server.xml

[root@node004 ~]# vi /usr/local/solrCloud/solr1/apache-tomcat-8.5.24/conf/server.xml

 

[root@node004 ~]# vi /usr/local/solrCloud/solr2/apache-tomcat-8.5.24/conf/server.xml [root@node004 ~]# vi /usr/local/solrCloud/solr3/apache-tomcat-8.5.24/conf/server.xml [root@node004 ~]# vi /usr/local/solrCloud/solr4/apache-tomcat-8.5.24/conf/server.xml

    

web.xml

[root@node004 ~]# vi /usr/local/solrCloud/solr1/apache-tomcat-8.5.24/webapps/solr/WEB-INF/web.xml

[root@node004 ~]# vi /usr/local/solrCloud/solr2/apache-tomcat-8.5.24/webapps/solr/WEB-INF/web.xml [root@node004 ~]# vi /usr/local/solrCloud/solr3/apache-tomcat-8.5.24/webapps/solr/WEB-INF/web.xml [root@node004 ~]# vi /usr/local/solrCloud/solr4/apache-tomcat-8.5.24/webapps/solr/WEB-INF/web.xml

 

catalina.sh

[root@node004 ~]# vi /usr/local/solrCloud/solr1/apache-tomcat-8.5.24/bin/catalina.sh

[root@node004 ~]# vi /usr/local/solrCloud/solr2/apache-tomcat-8.5.24/bin/catalina.sh [root@node004 ~]# vi /usr/local/solrCloud/solr3/apache-tomcat-8.5.24/bin/catalina.sh [root@node004 ~]# vi /usr/local/solrCloud/solr4/apache-tomcat-8.5.24/bin/catalina.sh

上傳配置文件至zookeeper

調用solr解壓目錄zkCli.sh上傳配置文件

[root@node004 ~]# cd /root/solr-7.2.0/server/scripts/cloud-scripts/
[root@node004 cloud-scripts]# ls
log4j.properties  snapshotscli.sh  zkcli.bat  zkcli.sh
[root@node004 cloud-scripts]# ./zkcli.sh -zkhost 192.168.178.161:2181,192.168.178.161:2182,192.168.178.161:2183  -cmd upconfig -confdir /usr/local/s
olrCloud/solr1/home/jonychen/conf/  -confname jonychen

查看是否上傳成功

[root@node001 ~]# /usr/local/zkCluster/zk1/bin/zkServer.sh statusZooKeeper JMX enabled by defaultUsing config: /usr/local/zkCluster/zk1/bin/../conf/zoo.cfgMode: follower[root@node001 ~]# /usr/local/zkCluster/zk1/bin/zkCli.sh

有configs則說明上傳成功

[zk: localhost:2181(CONNECTED) 1] quitQuitting...

啓動4個tomcat

爲方便查看日誌,複製四個窗口進行操做,分別切換到各自對應的目錄

[root@node004 ~]# cd /usr/local/solrCloud/solr1[root@node004 solr1]# lsapache-tomcat-8.5.24 home logs[root@node004 solr1]# ./apache-tomcat-8.5.24/bin/startup.sh && tailf ./apache-tomcat-8.5.24/logs/catalina.out

啓動成功界面

 

 

建立集羣

可使用瀏覽器控制檯,也能夠在後臺使用./solr create 命令建立

相關文章
相關標籤/搜索