solrCloud的主要功能:主要功能包括強大的全文搜索,點擊顯示,面搜索,動態聚類,數據庫集成,豐富的文件(如Word,PDF)處理,和空間搜索,而且他具有高度的可擴展性,提供容錯的分布式搜索和索引。 1)集中式的配置信息
2)自動容錯
3)近實時搜索
4)查詢時自動負載均衡
圖1. Collection大致結構圖

1、下載https://zookeeper./
2、下載http://lucene./solr/
3、下載http://tomcat./
下面我就開始學習之旅:首先復制三個tomcat例如:
tomcat-server_1 端口:8080
tomcat-server_2 端口:8090
tomcat-server_3 端口:8100
一、在分別復制solr-4.7.0下面的example/webapps的solr.war解壓復制到tomcat-server_1、tomcat-server_2、tomcat-server_3的webapp下面為solr,分別創建三個文件夾分別為solr_home_1、solr_home_2、solr_home_3作為存放solr的數據。將solr-4.7.0下面example/solr/分別復制到solr_home_1、solr_home_2、solr_home_3下面。
圖2:

二、分別修改solr_home_1、solr_home_2、solr_home_3下面的solr.xml。 <solr>
<solrcloud>
<str name="host">${host:}</str>
<int name="hostPort">${jetty.port:8080}</int>//端口分別對應tomcat的端口
<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>
其他solr.xml同理。
三、分別進入tomcat-server_1、tomcat-server_2、tomcat-server_3 下面的webapp下面的solr,然后去改WEB-INF下的web.xml,分別為下面的清單: <env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-value>D:/solrCloud/solr_home_1</env-entry-value>//定義solr索引所存的地址
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-value>D:/solrCloud/solr_home_2</env-entry-value>//定義solr索引所存的地址
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-value>D:/solrCloud/solr_home_3</env-entry-value>//定義solr索引所存的地址
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
四、分別在tomcat-server_1、tomcat-server_2、tomcat-server_3的bin下面的catalina.bat的添加 set java_opts=-Dsolr.home=d:/solrCloud/solr_home_1 -Dbootstrap_confdir=D:/solrCloud/solr_home_1/collection1/conf -Dcollection.configName=myconf -DnumShards=2 -DzkHost=127.0.0.1:2181
set JAVA_OPTS=-Dsolr.home=d:/solrCloud/solr_home_2 -DzkHost=127.0.0.1:2181
set JAVA_OPTS=-Dsolr.home=d:/solrCloud/solr_home_3 -DzkHost=127.0.0.1:2181
五、復制三個zoo例如: zk-server_1 端口:2181
zk-server_2 端口:2182
zk-server_3 端口:2183
在zk-server_1、zk-server_2、zk-server_3下面分別建立兩個文件夾為data和logs用來存儲數據和日志。
分別再data目錄下面創建myid,里面分別寫1、2、3。
配置D:\solrCloud\zk-server_1\conf\zoo.cfg如下:
dataDir=D:/solrCloud/zk-server_1/data
dataLogDir=D:/solrCloud/zk-server_1/logs
clientPort=2181
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890
其他兩個配置如同上面配置。
圖3:

下面我們啟動zk_server1、zk_server2、zk_server3.如下圖:
圖4:

啟動時,第一個報錯是因為找不到其他兩個zk,才會報錯。這都是不要緊的,三個啟動好了就不會報錯了。
下面我們在啟動tomcat-server_1、tomcat-server_2、tomcat-server_3。
圖5:
圖6:
 創建
http://127.0.0.1:8080/solr/admin/collections?action=CREATE&name=collection1&numShards=3&replicationFactor=2&maxShardsPerNode=2&collection.configName=myconf
重新加載接口
http://127.0.0.1:8080/solr/admin/collections?action=RELOAD&name=collection1
刪除
http://127.0.0.1:8080s/solr/admin/collections?action=DELETE&name=collection1
清單1. SolrCloud.java
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Map;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.SolrServerException;
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.apache.solr.common.SolrInputDocument;
public class SolrCloud {
private static CloudSolrServer cloudSolrServer;
private static synchronized CloudSolrServer getCloudSolrServer(final String zkHost) {
if (cloudSolrServer == null) {
try {
cloudSolrServer = new CloudSolrServer(zkHost);
} catch (Exception e) {
e.printStackTrace();
}
}
return cloudSolrServer;
}
//添加索引
private void addIndex(SolrServer solrServer) {
try {
SolrInputDocument doc1 = new SolrInputDocument();
doc1.addField("id", "421245251215121452521251");
doc1.addField("title", "張三");
SolrInputDocument doc2 = new SolrInputDocument();
doc2.addField("id", "4224558524254245848524243");
doc2.addField("title", "李四");
SolrInputDocument doc3 = new SolrInputDocument();
doc3.addField("id", "4543543458643541324153453");
doc3.addField("title", "王五");
Collection<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();
docs.add(doc1);
docs.add(doc2);
docs.add(doc3);
solrServer.add(docs);
solrServer.commit();
} catch (SolrServerException e) {
System.out.println("Add docs Exception !!!");
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
System.out.println("Unknowned Exception!!!!!");
e.printStackTrace();
}
}
// 搜索
public void search(SolrServer solrServer, String String) {
SolrQuery query = new SolrQuery();
query.setQuery(String);
try {
QueryResponse response = solrServer.query(query);
SolrDocumentList docs = response.getResults();
for (SolrDocument doc : docs) {
for (Map.Entry<String, Object> entry : doc) {
System.out.println(entry.getKey()+"="+entry.getValue());
}
}
} catch (SolrServerException e) {
e.printStackTrace();
} catch (Exception e) {
System.out.println("Unknowned Exception!!!!");
e.printStackTrace();
}
}
//刪除
public void deleteAllIndex(SolrServer solrServer) {
try {
solrServer.deleteByQuery("*:*");// delete everything!
solrServer.commit();
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
System.out.println("Unknowned Exception !!!!");
e.printStackTrace();
}
}
public static void main(String[] args) {
final String zkHost = "127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183";
final String defaultCollection = "collection1";
final int zkClientTimeout = 20000;
final int zkConnectTimeout = 1000;
CloudSolrServer cloudSolrServer = getCloudSolrServer(zkHost);
System.out.println("The Cloud SolrServer Instance has benn created!");
cloudSolrServer.setDefaultCollection(defaultCollection);
cloudSolrServer.setZkClientTimeout(zkClientTimeout);
cloudSolrServer.setZkConnectTimeout(zkConnectTimeout);
cloudSolrServer.connect();
System.out.println("The cloud Server has been connected !!!!");
SolrCloud test = new SolrCloud();
test.addIndex(cloudSolrServer);
test.search(cloudSolrServer, "id:*");
test.deleteAllIndex(cloudSolrServer);
test.search(cloudSolrServer, "id:*");
System.out.println("hashCode"+test.hashCode());
cloudSolrServer.shutdown();
}
}
相關閱讀 使用Vert.x構建Web服務器和消息系統 RABBITMQ在分布式系統的應用
作者信息
作者系力譜宿云 LeapCloud 團隊_云服務研發成員:JinYang Zhang【原創】
首發地址:https://blog./archives/977 歡迎關注微信訂閱號:從移動到云端 歡迎加入我們的力譜宿云 LeapCloud 活動QQ群:555973817,我們將不定期做技術分享活動。
若有轉載需要,請轉發時注意自帶作者信息一欄并本自媒體公號:力譜宿云 LeapCloud,尊重原創作者的勞動成果~ 謝謝配合~
|