Solr集群搭建,zookeeper集群搭建,Solr分片管理,Solr集群下的DataImport,分词配置。...
1?? 什么是SolrCloud
SolrCloud(solr 云)是Solr提供的分布式搜索方案,當你需要大規模,容錯,分布式索引和檢索能力時使用 SolrCloud。當一個系統的索引數據量少的時候是不需要使用SolrCloud的,當索引量很大,搜索請求并發很高,這時需要使 用SolrCloud來滿足這些需求。
SolrCloud是基于Solr和Zookeeper的分布式搜索方案,它的主要思想是使用Zookeeper作為集群的配置信息中心。
它有幾個特色功能:
1)集中式的配置信息
2)自動容錯
3)近實時搜索
4)查詢時自動負載均衡
1.1? Zookeeper是個什么玩意?
顧名思義zookeeper就是動物園管理員,他是用來管hadoop(大象)、Hive(蜜蜂)、pig(小豬)的管理員, Apache Hbase和 Apache Solr 的分布式集群都用到了zookeeper;Zookeeper:是一個分布式的、開源的程序協調服務,是hadoop項目下的一個子項目。
1.2 ? Zookeeper可以干哪些事情
?
1、配置管理
在我們的應用中除了代碼外,還有一些就是各種配置。比如數據庫連接等。一般我們都是使用配置文件的方式,在代碼中引入這些配置文件。但是當我們只有一種配置,只有一臺服務器,并且不經常修改的時候,使用配置文件是一個很好的做法,但是如果我們配置非常多,有很多服務器都需要這個配置,而且還可能是動態的話使用配置文件就不是個好主意了。這個時候往往需要尋找一種集中管理配置的方法,我們在這個集中的地方修改了配置,所有對這個配置感興趣的都可以獲得變更。比如我們可以把配置放在數據庫里,然后所有需要配置的服務都去這個數據庫讀取配置。但是,因為很多服務的正常運行都非常依賴這個配置,所以需要這個集中提供配置服務的服務具備很高的可靠性。一般我們可以用一個集群來提供這個配置服務,但是用集群提升可靠性,那如何保證配置在集群中的一致性呢? 這個時候就需要使用一種實現了一致性協議的服務了。Zookeeper就是這種服務,它使用Zab這種一致性協議來提供一致性。現在有很多開源項目使用Zookeeper來維護配置,比如在HBase中,客戶端就是連接一個Zookeeper,獲得必要的HBase集群的配置信息,然后才可以進一步操作。還有在開源的消息隊列Kafka中,也使用Zookeeper來維護broker的信息。在Alibaba開源的SOA框架Dubbo中也廣泛的使用Zookeeper管理一些配置來實現服務治理。
2、名字服務
名字服務這個就很好理解了。比如為了通過網絡訪問一個系統,我們得知道對方的IP地址,但是IP地址對人非常不友好,這個時候我們就需要使用域名來訪問。但是計算機是不能是別域名的。怎么辦呢?如果我們每臺機器里都備有一份域名到IP地址的映射,這個倒是能解決一部分問題,但是如果域名對應的IP發生變化了又該怎么辦呢?于是我們有了DNS這個東西。我們只需要訪問一個大家熟知的(known)的點,它就會告訴你這個域名對應的IP是什么。在我們的應用中也會存在很多這類問題,特別是在我們的服務特別多的時候,如果我們在本地保存服務的地址的時候將非常不方便,但是如果我們只需要訪問一個大家都熟知的訪問點,這里提供統一的入口,那么維護起來將方便得多了。
3、分布式鎖
其實在第一篇文章中已經介紹了Zookeeper是一個分布式協調服務。這樣我們就可以利用Zookeeper來協調多個分布式進程之間的活動。比如在一個分布式環境中,為了提高可靠性,我們的集群的每臺服務器上都部署著同樣的服務。但是,一件事情如果集群中的每個服務器都進行的話,那相互之間就要協調,編程起來將非常復雜。而如果我們只讓一個服務進行操作,那又存在單點。通常還有一種做法就是使用分布式鎖,在某個時刻只讓一個服務去干活,當這臺服務出問題的時候鎖釋放,立即fail over到另外的服務。這在很多分布式系統中都是這么做,這種設計有一個更好聽的名字叫LeaderElection(leader選舉)。比如HBase的Master就是采用這種機制。但要注意的是分布式鎖跟同一個進程的鎖還是有區別的,所以使用的時候要比同一個進程里的鎖更謹慎的使用。
4、集群管理
在分布式的集群中,經常會由于各種原因,比如硬件故障,軟件故障,網絡問題,有些節點會進進出出。有新的節點加入進來,也有老的節點退出集群。這個時候,集群中其他機器需要感知到這種變化,然后根據這種變化做出對應的決策。比如我們是一個分布式存儲系統,有一個中央控制節點負責存儲的分配,當有新的存儲進來的時候我們要根據現在集群目前的狀態來分配存儲節點。這個時候我們就需要動態感知到集群目前的狀態。還有,比如一個分布式的SOA架構中,服務是一個集群提供的,當消費者訪問某個服務時,就需要采用某種機制發現現在有哪些節點可以提供該服務(這也稱之為服務發現,比如Alibaba開源的SOA框架Dubbo就采用了Zookeeper作為服務發現的底層機制)。還有開源的Kafka隊列就采用了Zookeeper作為Cosnumer的上下線管理。
2?? Solr集群的結構
3?? Solr集群的搭建
本教程的這套安裝是單機版的安裝,所以采用偽集群的方式進行安裝,如果是真正的生產環境,將偽集群的ip改下就可以了,步驟是一樣的。
SolrCloud結構圖如下:
?
需要三個zookeeper節點
四個solr節點
4?? Zookeeper集群的搭建
4.1?? 軟件環境
三個zookeeper實例。Zookeeper也是java開發的所以需要安裝jdk。
1、Linux系統
2、Jdk環境。
3、Zookeeper。
?
服務器及軟件信息信息
1 | 192.168.106.80 | 服務器上的位置:/usr/local/apache-tomcat-7.0.73 |
服務器ip和端口號:192.168.106.80:8080 | ||
JDK-Version: 1.7.0_79 | ||
Zookeeper: /home/tuzq/software/zookeeper | ||
2 | 192.168.106.81 | 服務器上的位置:/usr/local/apache-tomcat-7.0.73 |
服務器ip和端口號:192.168.106.81:8080 | ||
JDK-Version: 1.7.0_79 | ||
Zookeeper: /home/tuzq/software/zookeeper | ||
3 | 192.168.106.82 | 服務器上的位置:/usr/local/apache-tomcat-7.0.73 |
服務器ip和端口號:192.168.106.82:8080 | ||
JDK-Version: 1.7.0_79 | ||
Zookeeper: /home/tuzq/software/zookeeper | ||
4 | 192.168.106.83 | 服務器上的位置:/usr/local/apache-tomcat-8.5.12 |
服務器ip和端口號:192.168.106.83:8080 | ||
JDK-Version: 1.7.0_79 |
使用偽分布式實現solr集群。需要三個zookeeper實例,4個tomcat實例,可以在一臺虛擬機上模擬。建議虛擬機1G以上內存。
其中,192.168.106.83服務器上的tomcat是8.5的,當然也可以從其它服務器上拷貝一個完整的過來,使用命令如下:
| [root@hadoop3 local]# ls apache-tomcat-7.0.73? bin? etc? games? include? java? lib? lib64? libexec? redis? sbin? share? solrcloud? src [root@hadoop3 local]# pwd /usr/local ##下面的意思是從當前的/usr/local中將apache-tomcat-7.0.73拷貝到192.168.106.83的root用戶下的/usr/local目錄下。 [root@hadoop3 local]# scp -r apache-tomcat-7.0.73 root@192.168.106.83:/usr/local/ The authenticity of host '192.168.106.83 (192.168.106.83)' can't be established. RSA key fingerprint is dc:55:2c:80:6a:9e:3d:a5:56:d7:0d:41:ba:d2:56:3c. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.106.83' (RSA) to the list of known hosts. root@192.168.106.83's password: 拷貝完后,進入83的/usr/local下查看內容 [root@localhost local]# pwd /usr/local [root@localhost local]# ls apache-tomcat-7.0.73? apache-tomcat-8.5.12? bin? etc? games? include? jdk1.8.0_73? lib? lib64? libexec? sbin? share? solrcloud? src [root@localhost local]# |
?
4.2 ? Zookeeper的安裝步驟
??? 關于Zookeeper的集群安裝配置參考:http://blog.csdn.net/tototuzuoquan/article/details/54003140
5?? Solr實例的搭建
第一步:在4臺服務器上分別安裝tomcat,具體的軟件安信息參考上面的4.1章節。
第二步:將solr-4.10.3.tgz.tgz分別上傳到/home/tuzq/software下。
效果圖如下:
解壓solr-4.10.3.tar.gz壓縮包。
| cd /home/tuzq/software tar –zxvf solr-4.10.3.tgz.tgz 解壓命令執行完成之后執行ls命令,當前所在目錄下多了一個solr-4.10.3 [root@localhost software]# ls apache-tomcat-8.5.12.tar.gz? jdk-8u73-linux-x64.tar.gz ?solr-4.10.3? solr-4.10.3.tgz.tgz |
從壓縮包中復制solr.war到tomcat。
| 其中192.168.106.80、192.168.106.81、192.168.106.82,192.168.106.83這三臺服務器執行的命令如下: [root@hadoop3 software]# cd /home/tuzq/software/solr-4.10.3/example/webapps [root@hadoop3 webapps]# ls solr.war [root@hadoop3 webapps]#cp -R solr.war /usr/local/apache-tomcat-7.0.73/webapps [root@hadoop3 webapps]# cd /usr/local/apache-tomcat-7.0.73/webapps [root@hadoop3 webapps]# ls docs? examples? host-manager? manager? ROOT? solr.war |
??? ??創建/usr/local/solrcloud這個文件夾,并將/home/tuzq/software/solr-4.10.3/example的solr文件拷貝到/usr/local/solrcloud,并將solr名稱改成solrhome
| [root@localhost local] cd /usr/local [root@localhost local] mkdir solrcloud ? 拷貝solr,并改變solr的名稱 [root@hadoop1 example]# cd /home/tuzq/software/solr-4.10.3/example [root@hadoop1 example]# ls contexts example-DIH example-schemaless logs README.txt scripts solr-webapp? webapps?? etc? exampledocs? lib? ?multicore? resources? ?solr ????start.jar [root@hadoop1 example]# cp -R solr /usr/local/solrcloud [root@localhost example]# cd /usr/local/solrcloud [root@localhost solrcloud]# ls solr [root@localhost solrcloud]#mv solr solrhome [root@localhost solrcloud]# ls solrhome [root@localhost solrcloud]# |
???? 修改solrhome下的solr.xml
| [root@localhost solrcloud]# cd solrhome [root@localhost solrhome]# ls bin? collection1? README.txt? solr.xml? zoo.cfg [root@localhost solrhome]# pwd /usr/local/solrcloud/solrhome |
192.168.106.80服務器上的配置修改如下(其中下面紅色部分表示的tomcat所在的服務器的ip和端口號):
| <solr> ? ? <solrcloud> ??? <str name="host">${host:192.168.106.80}</str> ??? <int name="hostPort">${jetty.port:8080}</int> ??? <str name="hostContext">${hostContext:solr}</str> ??? <int name="zkClientTimeout">${zkClientTimeout:30000}</int> ??? <bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool> ? </solrcloud> ? ? <!—下面的配置暫時不動--> ? <shardHandlerFactory name="shardHandlerFactory" ??? class="HttpShardHandlerFactory"> ??? <int name="socketTimeout">${socketTimeout:0}</int> ??? <int name="connTimeout">${connTimeout:0}</int> ? </shardHandlerFactory> ? </solr> |
??? 192.168.106.81服務器上的配置修改如下(其中下面紅色部分表示的tomcat所在的服務器的ip和端口號):
| <solr> ? ? <solrcloud> ??? <str name="host">${host:192.168.106.81}</str> ??? <int name="hostPort">${jetty.port:8080}</int> ? ??<str name="hostContext">${hostContext:solr}</str> ??? <int name="zkClientTimeout">${zkClientTimeout:30000}</int> ??? <bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool> ? </solrcloud> ? ? <!—下面的配置暫時不動--> ? <shardHandlerFactory name="shardHandlerFactory" ??? class="HttpShardHandlerFactory"> ??? <int name="socketTimeout">${socketTimeout:0}</int> ??? <int name="connTimeout">${connTimeout:0}</int> ? </shardHandlerFactory> ? </solr> |
???? 192.168.106.82服務器上的配置修改如下(其中下面紅色部分表示的tomcat所在的服務器的ip和端口號):
| <solr> ? ? <solrcloud> ??? <str name="host">${host:192.168.106.82}</str> ??? <int name="hostPort">${jetty.port:8080}</int> ??? <str name="hostContext">${hostContext:solr}</str> ??? <int name="zkClientTimeout">${zkClientTimeout:30000}</int> ??? <bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool> ? </solrcloud> ? ? <!—下面的配置暫時不動--> ? <shardHandlerFactory name="shardHandlerFactory" ??? class="HttpShardHandlerFactory"> ??? <int name="socketTimeout">${socketTimeout:0}</int> ??? <int name="connTimeout">${connTimeout:0}</int> ? </shardHandlerFactory> ? </solr> |
192.168.106.83服務器上的配置修改如下(其中下面紅色部分表示的tomcat所在的服務器的ip和端口號):
| <solr> ? ? <solrcloud> ??? <str name="host">${host:192.168.106.83}</str> ??? <int name="hostPort">${jetty.port:8080}</int> ??? <str name="hostContext">${hostContext:solr}</str> ??? <int name="zkClientTimeout">${zkClientTimeout:30000}</int> ??? <bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool> ? </solrcloud> ? ? <!—下面的配置暫時不動--> ? <shardHandlerFactory name="shardHandlerFactory" ??? class="HttpShardHandlerFactory"> ??? <int name="socketTimeout">${socketTimeout:0}</int> ??? <int name="connTimeout">${connTimeout:0}</int> ? </shardHandlerFactory> ? </solr> |
第三步:重新啟動tomcat(192.168.106.81~83四臺都重啟,以重啟81為例),解壓war包。
| [root@hadoop1 bin] cd /usr/local/apache-tomcat-7.0.73/bin [root@hadoop1 bin]# ./shutdown.sh [root@hadoop1 bin]# ./startup.sh #通過下面的命令查看tomcat啟動情況 [root@hadoop1 bin]# ps -ef | grep tomcat | grep -v grep #進入webapp目錄下,查看solr.war的解壓情況 [root@hadoop1 bin] cd /usr/local/apache-tomcat-7.0.73/webapps [root@hadoop1 webapps]# ls docs? examples? host-manager? manager? ROOT? solr? solr.war 注意:要先停掉tomcat,然后再刪除這個solr.war [root@hadoop1 bin] cd /usr/local/apache-tomcat-7.0.73/bin [root@hadoop1 bin]# ./shutdown.sh [root@hadoop1 bin] cd /usr/local/apache-tomcat-7.0.73/webapps [root@hadoop1 webapps]# rm -rf solr.war [root@hadoop1 webapps]# ls docs? examples? host-manager? manager? ROOT? solr #重啟一下tomcat. [root@hadoop1 bin] cd /usr/local/apache-tomcat-7.0.73/bin [root@hadoop1 bin]# ./startup.sh |
把solr-4.10.3目錄下example目錄下的關于日志相關的jar包添加到solr工程中。
| #添加擴展依賴包(日志包) [root@hadoop3 ext]# cd /home/tuzq/software/solr-4.10.3/example/lib/ext [root@hadoop3 ext]# ls jcl-over-slf4j-1.7.6.jar? jul-to-slf4j-1.7.6.jar? log4j-1.2.17.jar? slf4j-api-1.7.6.jar ?slf4j-log4j12-1.7.6.jar ?[root@hadoop3 ext] cp -R * /usr/local/apache-tomcat-7.0.73/webapps/solr/WEB-INF/lib/ cd solr-4.10.3 #在WEB-INFO下創建一個classes目錄 cd /usr/local/apache-tomcat-7.0.73/webapps/solr/WEB-INF mkdir classes ? #將日志文件拷貝到classes目錄下 cp -r /home/tuzq/software/solr-4.10.3/example/resources/log4j.properties /usr/local/apache-tomcat-7.0.73/webapps/solr/WEB-INF/classes |
?
第四步:創建solrhome。修改web.xml指定solrhome的位置。
| cd /usr/local/apache-tomcat-7.0.73/webapps/solr/WEB-INF vim web.xml <env-entry> <env-entry-name>solr/home</env-entry-name> <env-entry-value>/usr/local/solrcloud/solrhome</env-entry-value> <env-entry-type>java.lang.String</env-entry-type> </env-entry> |
?
?
其它solr相關的配置參考:http://blog.csdn.net/tototuzuoquan/article/details/61446788
?
6?? solr集群的搭建
6.1?? 第一步
把solrhome中的配置文件上傳到zookeeper集群。使用zookeeper的客戶端上傳。
客戶端命令位置:/home/tuzq/software/solr-4.10.3/example/scripts/cloud-scripts
??? 使用zookeeper統一管理配置文件。需要把solrhome下的collection/的conf文件上傳至zookeeper
執行下邊的命令將/usr/local/solrcloud/solrhome/collection1/conf下的配置文件上傳到zookeeper(此命令為單條命令,雖然很長。此命令在solr-4.10.3/example/scripts/cloud-scripts/目錄下:
./zkcli.sh -zkhost 192.168.106.80:2181,192.168.106.81:2181,192.168.106.82:2181 -cmd upconfig -confdir /usr/local/solrcloud/solrhome/collection1/conf -confname myconf |
?紅色字體部分的ip表示zookeeper集群的ip地址以及對應的端口。
?
查看配置文件是否上傳成功:
[root@bogon bin]# cd /home/tuzq/software/zookeeper/bin
[root@bogon bin]# ./zkCli.sh
Connecting to localhost:2181
?[zk: localhost:2181(CONNECTED) 8] ls /
[configs, zookeeper, myboys, mygirls]
[zk: localhost:2181(CONNECTED) 1] ls /configs
[myconf]
?[zk: localhost:2181(CONNECTED) 13] ls /configs/myconf
[currency.xml, mapping-FoldToASCII.txt,protwords.txt, scripts.conf, synonyms.txt, stopwords.txt, velocity,_schema_analysis_synonyms_english.json, admin-extra.html, update-script.js,_schema_analysis_stopwords_english.json, solrconfig.xml,admin-extra.menu-top.html, elevate.xml, schema.xml, clustering,mapping-ISOLatin1Accent.txt, spellings.txt, xslt, _rest_managed.json, lang,admin-extra.menu-bottom.html]
[zk: localhost:2181(CONNECTED) 14]
6.2 ? 第三步
修改每一臺solr的tomcat 的 bin目錄下catalina.sh文件中加入DzkHost指定zookeeper服務器地址:
[root@localhost bin]#cd /usr/local/apache-tomcat-7.0.73/bin
[root@localhost bin]#vim catalina.sh
JAVA_OPTS="-DzkHost=192.168.106.80:2181,192.168.106.81:2181,192.168.106.82:2181" ? ? ? ?
紅色字體的ip表示zookeeper集群的ip以及端口號(注意:每個之間的逗號之間不允許有空格)
(可以使用vim的查找功能查找到JAVA_OPTS的定義的位置,然后添加,可以在catalina.sh的第二行添加)
6.4 ? 第四步
重新啟動tomcat
瀏覽器上訪問:http://192.168.106.81:8080/solr/#/~cloud
一個主節點多個備份節點,集群只有一片。
6.5 ? 第五步
創建一個兩片的collection,每片是一主一備。
?
使用以下命令創建:
http://192.168.106.81:8080/solr/admin/collections?action=CREATE&name=collection2&numShards=2&replicationFactor=2
?
6.6 ? 第六步
刪除collection1.
http://192.168.106.81:8080/solr/admin/collections?action=DELETE&name=collection1
?
7、配置dataimport插件
1、? 將/home/tuzq/software/solr-4.10.3下的contrib和dist拷貝到/usr/local/solrcloud(四臺服務器都需要這樣做)
| [root@localhost solr-4.10.3]# cd /home/tuzq/software/solr-4.10.3 [root@localhost solr-4.10.3]# cp -R contrib /usr/local/solrcloud [root@localhost solr-4.10.3]# cp -R dist /usr/local/solrcloud |
?
使用下面的方式將數據導入所需的jar放到相應的位置:
| [root@hadoop2 contrib]# cd /usr/local/solrcloud/contrib [root@hadoop2 contrib]# mkdir db [root@hadoop2 contrib]# cd db [root@hadoop2 db]# mkdir lib ? 進入:/home/tuzq/software/solr-4.10.3/dist,將: solr-dataimporthandler-4.10.3.jar、solr-dataimporthandler-extras-4.10.3.jar放到 ? 將 solr-dataimporthandler-4.10.3.jar? solr-dataimporthandler-extras-4.10.3.jar最終上傳到lib文件夾下 ? 最后的效果如下: [root@hadoop2 lib]# pwd /usr/local/solrcloud/contrib/dataimporthandler/lib [root@hadoop2 lib]# ls solr-dataimporthandler-4.10.3.jar? solr-dataimporthandler-extras-4.10.3.jar [root@hadoop2 lib]# ? 最終將mysql-connector-java-5.1.38.jar放入到:/usr/local/solrcloud/contrib/db/lib中 cd /usr/local/solrcloud/contrib/db/lib ? 最終效果如下: [root@hadoop1 lib]# pwd /usr/local/solrcloud/contrib/db/lib [root@hadoop1 lib]# ls mysql-connector-java-5.1.38.jar [root@hadoop1 lib]# |
?
2、? 創建分詞,創建方式參考:http://blog.csdn.net/tototuzuoquan/article/details/61446788中關于分詞部分的內容:
| [root@hadoop2 lib] cd /usr/local/apache-tomcat-7.0.73/webapps/solr/WEB-INF/lib 將IKAnalyzer2012_FF.jar和IKAnalyzer2012FF_u1.jar放入到該文件夾下: ? 將IK-Analyzer-2012FF\src下的ext.dic、IKAnalyzer.cfg.xml、stopword.dic上傳到:/usr/local/apache-tomcat-7.0.73/webapps/solr/WEB-INF/classes |
?
3、? 以192.168.106.80為例,發現在之前放置的如下文件/usr/local/solrcloud/solrhome/collection1/conf,已經在創建集群的時候給刪除了。這時候進入:/home/tuzq/software/solr-4.10.3/example/solr/collection1/conf,在下面創建一個data-config.xml文件,文件內容是:
?
| <?xml version="1.0" encoding="UTF-8" ?>? <dataConfig>?? ???????? <dataSource type="JdbcDataSource"?? ?????????????????? ? driver="com.mysql.jdbc.Driver"?? ?????????????????? ? url="jdbc:mysql://192.168.106.80:3306/solr" ?????????????????? ? user="root"?? ?????????????????? ? password="123456"/> ???????? <document>?? ?????????????????? <entity name="product" query="SELECT pid,name,catalog,catalog_name,price,description,picture FROM products"> ??????????????????????????? ?<field column="pid" name="id"/> ??????????????????????????? ?<field column="name" name="product_name"/> ??????????????????????????? ?<field column="catalog" name="product_catalog"/> ??????????????????????????? ?<field column="catalog_name" name="product_catalog_name"/> ??????????????????????????? ?<field column="price" name="product_price"/> ??????????????????????????? ?<field column="description" name="product_description"/> ??????????????????????????? ?<field column="picture" name="product_picture"/> ?????????????????? </entity>?? ???????? </document> ? </dataConfig> |
?
修改schema.xml:
內容如下:
| <fieldType name="text_ik" class="solr.TextField"> ????? <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/> ??? </fieldType> ??? ???????? <!--定義field,指定field的type屬性為text_ik--> ???????? <field name="title_ik" type="text_ik" indexed="true" stored="true" /> ??? <field name="content_ik" type="text_ik" indexed="true" stored="false" multiValued="true"/> ???????? ???????? <!-- 商品名稱 --> ???????? <field name="product_name" type="text_ik" indexed="true" stored="true" /> ? ???????? <!-- 商品分類id --> ???????? <field name="product_catalog" type="string" indexed="true" stored="true" /> ???????? ???????? <!-- 商品分類名稱 --> ???????? <field name="product_catalog_name" type="string" indexed="true" stored="true" /> ???????? ???????? <!-- 商品價格 --> ???????? <field name="product_price" type="float" indexed="true" stored="true" /> ???????? ???????? <!-- 商品描述 --> ???????? <field name="product_description" type="text_ik" indexed="true" stored="false" /> ???????? ???????? <!-- 商品圖片 --> ???????? <field name="product_pic" type="string" indexed="false" stored="true" /> ???????? ???????? <field name="product_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/> ???????? <!-- ???????? 使用復制域、將product_name和product_description ???????? 都復制到product_keywords,當搜索product_keywords的時候 ???????? --> ???????? <copyField source="product_name" dest="product_keywords"/> ???????? <copyField source="product_description" dest="product_keywords"/> |
?
修改solrconfig.xml的配置,可以參考http://blog.csdn.net/tototuzuoquan/article/details/61446788中關于數據導入相關的配置:
| <lib dir="${solr.install.dir:../..}/contrib/extraction/lib" regex=".*\.jar" /> ? <lib dir="${solr.install.dir:../..}/dist/" regex="solr-cell-\d.*\.jar" /> ? ? <lib dir="${solr.install.dir:../..}/contrib/clustering/lib/" regex=".*\.jar" /> ? <lib dir="${solr.install.dir:../..}/dist/" regex="solr-clustering-\d.*\.jar" /> ? ? <lib dir="${solr.install.dir:../..}/contrib/langid/lib/" regex=".*\.jar" /> ? <lib dir="${solr.install.dir:../..}/dist/" regex="solr-langid-\d.*\.jar" /> ? ? <lib dir="${solr.install.dir:../..}/contrib/velocity/lib" regex=".*\.jar" /> ? <lib dir="${solr.install.dir:../..}/dist/" regex="solr-velocity-\d.*\.jar" /> ? ? <lib dir="${solr.install.dir:../..}/contrib/dataimporthandler/lib" regex=".*\.jar"/> ? <lib dir="${solr.install.dir:../..}/contrib/db/lib" regex=".*\.jar"/> |
?
?
?
接著將/home/tuzq/software/solr-4.10.3/example/solr/collection1/conf中的配置文件上傳到zookeeper。
進入/home/tuzq/software/solr-4.10.3/example/scripts/cloud-scripts:
執行如下命令:
cd /home/tuzq/software/solr-4.10.3/example/scripts/cloud-scripts
./zkcli.sh -zkhost 192.168.106.80:2181,192.168.106.81:2181,192.168.106.82:2181 -cmd upconfig -confdir /home/tuzq/software/solr-4.10.3/example/solr/collection1/conf -confname myconf |
?
接著訪問:http://192.168.106.80:8080/solr
點擊data-config.xml文件
結果如下(發現數據庫連接已經修改過來了):
?
重啟tomcat集群。
| [root@hadoop1 bin] cd /usr/local/apache-tomcat-7.0.73/bin [root@hadoop1 bin]# ./shutdown.sh [root@hadoop1 bin]# ./startup.sh |
?
接著訪問:http://192.168.106.80:8080/solr/
直接執行Execute,發現可以進行數據同步了。
?
最后:
?
進入
?
執行查詢之后,發現右側已經有數據了。
?
?============================================
最后,solr集群搭建好之后,就可以用于調用了,案例如下(關于jar的獲取參考:http://blog.csdn.net/tototuzuoquan/article/details/61709204):
代碼如下:
?
| package cn.com.toto.cloud; ? import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.impl.CloudSolrServer; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.common.SolrDocument; import org.apache.solr.common.SolrDocumentList; import org.junit.Test; ? /** ?* @brief TestSolrCloud.java 集群配置 ?* @attention 使用注意事項 ?* @author toto ?* @date 2017年5月23日 ?* @note begin modify by 涂作權 2017年5月23日? 原始創建 ?*/ public class TestSolrCloud { ? ???????? @Test ???????? public void testCloud() throws Exception { ?????????????????? //創建一個連接 ?????????????????? String zkHost = "192.168.106.80:2181,192.168.106.81:2181,192.168.106.82:2181"; ?????????????????? //參數:zookeeper服務器的地址列表 ?????????????????? CloudSolrServer server = new CloudSolrServer(zkHost); ?????????????????? //指定默認連接的collection ?????????????????? server.setDefaultCollection("collection2"); ?????????????????? //創建一查詢對象 ?????????????????? SolrQuery solrQuery = new SolrQuery(); ?????????????????? solrQuery.setQuery("*:*"); ?????????????????? //執行查詢 ?????????????????? QueryResponse queryResponse = server.query(solrQuery); ?????????????????? SolrDocumentList solrDocumentList = queryResponse.getResults(); ?????????????????? System.out.println("查詢結果總數量:" + solrDocumentList.getNumFound()); ?????????????????? for (SolrDocument solrDocument : solrDocumentList) { ??????????????????????????? System.out.println(solrDocument.get("id")); ??????????????????????????? System.out.println(solrDocument.get("product_name")); ??????????????????????????? System.out.println(solrDocument.get("product_price")); ??????????????????????????? System.out.println(solrDocument.get("product_picture")); ?????????????????? } ???????? } } |
?
如果是整合在spring,springmvc的項目里面,整合方式如下:
1.1.1?? 實現步驟
第一步:創建一個web工程
第二步:導入jar包。Springmvc+spring+solrJ的jar包
第三步:開發dao
第四步:開發service
第五步:開發controller。
?
1.1.2?? Dao
| @Repository public class ProductDaoImpl implements ProductDao { ? ? ? ? //如果是單集的是HtttpSolrServer,如果是集群的環境下的,是SolrServer ???? @Autowired ? private SolrServer solrServer; ???? ???? @Override ???? public ResultModel queryProduct(SolrQuery solrQuery) throws Exception { ???? ???? ???? ???? //根據查詢條件查詢索引庫 ???? ???? QueryResponse response = solrServer.query(solrQuery); ???? ???? //取查詢結果 ???? ???? SolrDocumentList solrDocumentList = response.getResults(); ???? ???? //商品列表 ???? ???? List<ProductModel> productList = new ArrayList<>(); ???? ???? //遍歷列表 ???? ???? for (SolrDocument solrDocument : solrDocumentList) { ???? ???? ???? //取商品信息 ???? ???? ???? ProductModel model = new ProductModel(); ???? ???? ???? model.setPid((String) solrDocument.get("id")); ???? ???? ???? //取高亮顯示 ???? ???? ???? Map<String, Map<String, List<String>>> highlighting = response.getHighlighting(); ???? ???? ???? List<String> list = highlighting.get(solrDocument.get("id")).get("product_name"); ???? ???? ???? String productName = ""; ???? ???? ???? if (null != list && list.size() > 0) { ???? ???? ???? ???? productName = list.get(0); ???? ???? ???? } else { ???? ???? ???? ???? productName = (String) solrDocument.get("product_name"); ???? ???? ???? } ???? ???? ???? model.setName(productName); ???? ???? ???? model.setPrice((float) solrDocument.get("product_price")); ???? ???? ???? model.setPicture((String) solrDocument.get("product_picture")); ???? ???? ???? model.setCatalog_name((String) solrDocument.get("product_catalog_name")); ???? ???? ???? //添加到商品列表 ???? ???? ???? productList.add(model); ???? ???? } ???? ???? //添加到返回值對象中 ???? ???? ResultModel resultModel = new ResultModel(); ???? ???? resultModel.setProductList(productList); ???? ???? //查詢結果的總數量 ???? ???? resultModel.setRecordCount(solrDocumentList.getNumFound()); ???? ???? ???? ???? return resultModel; ???? } ? } |
?
?
1.1.3?? Service
| @Service public class ProductServiceImpl implements ProductService { ???? ???? @Autowired ???? private ProductDao productDao; ? ???? @Override ???? public ResultModel queryProduct(String queryString, String catalog_name, ???? ???? ???? String price, String sort, Integer page) throws Exception { ???? ???? SolrQuery solrQuery = new SolrQuery(); ???? ???? //拼裝查詢條件 ???? ???? //主查詢條件 ???? ???? if (null != queryString && !"".equals(queryString)) { ???? ???? ???? solrQuery.setQuery(queryString); ???? ???? } else { ???? ???? ???? solrQuery.setQuery("*:*"); ???? ???? } ???? ???? //根據商品分類過濾 ???? ???? if (null != catalog_name && !"".equals(catalog_name)) { ???? ???? ???? solrQuery.addFilterQuery("product_catalog_name:" + catalog_name); ???? ???? } ???? ???? //價格區間過濾 ???? ???? if (null != price && !"".equals(price)) { ???? ???? ???? String[] strings = price.split("-"); ???? ???? ???? solrQuery.addFilterQuery("product_price:["+strings[0]+" TO "+strings[1]+"]"); ???? ???? } ???? ???? //排序條件 ???? ???? if ("1".equals(sort)) { ???? ???? ???? solrQuery.setSort("product_price", ORDER.desc); ???? ???? } else { ???? ???? ???? solrQuery.setSort("product_price", ORDER.asc); ???? ???? } ???? ???? //分頁條件 ???? ???? if (null == page) page = 1; ???? ???? //計算分頁 ???? ???? int start = (page - 1) * Global.PAGE_SIZE; ???? ???? solrQuery.setStart(start); ???? ???? solrQuery.setRows(Global.PAGE_SIZE); ???? ???? //設置默認搜索域 ???? ???? solrQuery.set("df", "product_keywords"); ???? ???? //設置高亮 ???? ???? solrQuery.setHighlight(true); ???? ???? //高亮顯示的域 ???? ???? solrQuery.addHighlightField("product_name"); ???? ???? //高亮顯示的前綴 ???? ???? solrQuery.setHighlightSimplePre("<span style=\"color:red\">"); ???? ???? //高亮后綴 ???? ???? solrQuery.setHighlightSimplePost("</span>"); ???? ???? //執行查詢 ???? ???? ResultModel resultModel = productDao.queryProduct(solrQuery); ???? ???? //計算總頁數 ???? ???? Long recordCount = resultModel.getRecordCount(); ???? ???? int pageCount = (int) (recordCount / Global.PAGE_SIZE); ???? ???? if (recordCount % Global.PAGE_SIZE > 0) { ???? ???? ???? pageCount++; ???? ???? } ???? ???? resultModel.setPageCount(pageCount); ???? ???? resultModel.setCurPage(page); ???? ???? ???? ???? return resultModel; ???? } ? } |
?
1.1.4?? Controller
| @Controller public class ProductController { ? ???? @Autowired ???? private ProductService productService; ???? ???? @RequestMapping("/list") ???? public String queryProduct(String queryString, String catalog_name, ???? ???? ???? String price, String sort, Integer page, Model model) ???? ???? ???? throws Exception { ???? ???? //接收參數,調用service查詢商品列表 ???? ???? ResultModel resultModel = productService.queryProduct(queryString, catalog_name, price, sort, page); ???? ???? //把resultModel傳遞給頁面 ???? ???? model.addAttribute("result", resultModel); ???? ???? //參數回顯 ???? ???? model.addAttribute("queryString", queryString); ???? ???? model.addAttribute("catalog_name", catalog_name); ???? ???? model.addAttribute("price", price); ???? ???? model.addAttribute("sort", sort); ???? ???? model.addAttribute("page", page); ???? ???? //返回jsp頁面 ???? ???? return"product_list"; ???? } } |
?
1.1.5?? Web.xml
| <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> ? <display-name>SolrCloudJD</display-name> ? <welcome-file-list> ??? <welcome-file>index.html</welcome-file> ??? <welcome-file>index.htm</welcome-file> ??? <welcome-file>index.jsp</welcome-file> ??? <welcome-file>default.html</welcome-file> ??? <welcome-file>default.htm</welcome-file> ??? <welcome-file>default.jsp</welcome-file> ? </welcome-file-list> ? <!-- 前端控制器 --> ? <servlet> ? ?? <servlet-name>springmvc</servlet-name> ? ?? <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> ? ?? <init-param> ? ?? ???? <param-name>contextConfigLocation</param-name> ? ?? ???? <param-value>classpath:springmvc.xml</param-value> ? ?? </init-param> ? </servlet> ? <servlet-mapping> ? ?? <servlet-name>springmvc</servlet-name> ? ?? <url-pattern>*.action</url-pattern> ? </servlet-mapping> ? <!-- post亂碼過濾器 --> ? <filter> ??? <filter-name>Character Encoding</filter-name> ??? <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> ??? <init-param> ????? <param-name>encoding</param-name> ????? <param-value>UTF-8</param-value> ??? </init-param> ? </filter> ? <filter-mapping> ??? <filter-name>Character Encoding</filter-name> ??? <url-pattern>/*</url-pattern> ? </filter-mapping> ? </web-app> |
?
1.1.6?? Springmvc.xml
| <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" ???? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" ???? xmlns:context="http://www.springframework.org/schema/context" ???? xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" ???? xsi:schemaLocation="http://www.springframework.org/schema/beans ???? ???? http://www.springframework.org/schema/beans/spring-beans-3.1.xsd ???? ???? http://www.springframework.org/schema/mvc ???? ???? http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd ???? ???? http://www.springframework.org/schema/context ???? ???? http://www.springframework.org/schema/context/spring-context-3.1.xsd ???? ???? http://www.springframework.org/schema/aop ???? ???? http://www.springframework.org/schema/aop/spring-aop-3.1.xsd ???? ???? http://www.springframework.org/schema/tx ???? ???? http://www.springframework.org/schema/tx/spring-tx-3.1.xsd "> ???? <!-- 配置掃描包 --> ???? <context:component-scan base-package="xxxxx"/> ???? <!-- 配置注解驅動 --> ???? <mvc:annotation-driven/> ???? <!-- jsp視圖解析器 --> ???? <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" > ???? ???? <!-- 前綴 --> ???? ???? <property name="prefix" value="/WEB-INF/jsp/"></property> ???? ???? <!-- 后綴 --> ???? ???? <property name="suffix" value=".jsp"></property> ???? </bean> ???? <!-- 單機版的SolrServer --> ???? <!-- <bean class="org.apache.solr.client.solrj.impl.HttpSolrServer"> ???? ???? <constructor-arg value="http://localhost:8080/solr/"></constructor-arg> ???? </bean> --> ???? <!-- 集群環境SolrServer --> ???? <bean class="org.apache.solr.client.solrj.impl.CloudSolrServer"> ???? ???? <constructor-arg index="0" value="192.168.106.80:2181,192.168.106.81:2181,192.168.106.82:2181"/> ???? ???? <property name="defaultCollection" value="collection2"/> ???? </bean> ? </beans> |
?
?
?
總結
以上是生活随笔為你收集整理的Solr集群搭建,zookeeper集群搭建,Solr分片管理,Solr集群下的DataImport,分词配置。...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 12864液晶——读写、划点、划线、汉字
- 下一篇: linux虚拟机网络设置(本机使用公司内