最近因項目須要,安裝部署solr,這裏我記錄下學習solr中遇到的問題php
solr教程,網上不少,很氾濫;可是值得參考的很少,下面就整理一下我在學習solr過程當中的資料,一些能直接搜索到的文檔,我會列出文章名字和連接。前端
solr下載地址:http://archive.apache.org/dist/lucene/solr/java
Solr部署詳解:http://blog.csdn.net/xiaoyu411502/article/details/44835119node
這篇文章所述的場景是部署在tomcat上的,可是說的是linux上的,linux
你還能夠看這一篇,看下windows端的:http://blog.csdn.net/caicongyang/article/details/50084273,web
若是想用solr自帶的jetty部署的話須要另外注意。apache
下邊是用自帶的jetty部署solr:json
1,複製solr壓縮包到/usr/local下,解壓、bootstrap
2,進到 solr-5.3.1/bin目錄下vim
3,執行腳本,./install_solr_service.sh /usr/local/solr-5.3.1.zip
[root@localhost bin]# ./install_solr_service.sh /usr/local/solr-5.3.1.zip id: solr: no such user Creating new user: solr Extracting /usr/local/solr-5.3.1.zip to /opt Creating /etc/init.d/solr script ... Waiting up to 30 seconds to see Solr running on port 8983 [/] Started Solr server on port 8983 (pid=4765). Happy searching! Found 1 Solr nodes: Solr process 4765 running on port 8983 { "solr_home":"/var/solr/data/", "version":"5.3.1 1703449 - noble - 2015-09-17 01:48:15", "startTime":"2017-02-22T09:17:15.37Z", "uptime":"0 days, 0 hours, 0 minutes, 11 seconds", "memory":"69.3 MB (%14.1) of 490.7 MB"} Service solr installed. [root@localhost bin]#
使用腳本【install_solr_service.sh 】註冊solr爲服務,若是不加參數,solr會默認把solr_home註冊到 /var/solr/data ;並且默認用自帶的jetty啓動服務
install_solr_service.sh參數說明:
Supported OPTIONS include:
-d Directory for live / writable Solr files, such as logs, pid files, and index data; defaults to /var/solr
-i Directory to extract the Solr installation archive; defaults to /opt/
The specified path must exist prior to using this script.
-p Port Solr should bind to; default is 8983
-s Service name; defaults to solr
-u User to own the Solr files and run the Solr process as; defaults to solr
This script will create the specified user account if it does not exist.
註冊成功以後,就能夠用service的方式維護solr了,若是麼有權限,記得sudo
service solr start/stop/restart/status
部署成功以後,打開控制檯:http://localhost:8983/solr
常關注的地方
Dashboard:solr、lucene相關的版本,以及啓動solr實例的jvm的相關參數
Logging:就是solr的日誌輸出控制檯,其輸出格式按照各自實例對應的solr_home下的log4j.properties配置文件的配置、若是是Tomcat部署的,log4j.properties在solr-tomcat\webapps\solr\WEB-INF\classes目錄下
Core Admin:須要索引的複本實例
Java Properties:該solr實例的環境屬性
Thread Dump:該solr實例的線程內存轉儲快照
Dataimport:此頁籤是配置數據源,導入數據更新數據相關
Full-import:全量更新導入數據,執行配置文件中的「query」,根據惟一id比對索引,原來有的刪除,所有更新
Delta-import:增量更新導入,執行配置文件的「deltaImportQuery」、「deltaQuery」,只更新符合條件的數據
Clean:是否清理原來索引,執行full-import的時候,默認選中
Commit:提交,執行結果是否提交
Optimize:是否執行優化
Entity:默認主實體,dataConfig配置文件中的主實體
Documents:此頁籤是用於提交和跟新數據,通常不用
Files:列舉了對應core的配置文件
查詢頁面
q – 查詢字符串,必須的。
fl – 指定返回那些字段內容,用逗號或空格分隔多個。
start – 返回第一條記錄在完整找到結果中的偏移位置,0開始,通常分頁用。
rows – 指定返回結果最多有多少條記錄,配合start來實現分頁。
sort – 排序,格式:sort=<field name>+<desc|asc>[,<field name>+<desc|asc>]… 。示例:(inStock desc, price asc)表示先 「inStock」 降序, 再 「price」 升序,默認是相關性降序。
wt – (writer type)指定輸出格式,能夠有 xml, json, php, phps, 後面 solr 1.3增長的,要用通知咱們,由於默認沒有打開。
fq – (filter query)過慮查詢,做用:在q查詢符合結果中同時是fq查詢符合的,例如:q=mm&fq=date_time:[20081001 TO 20091031],找關鍵字mm,而且date_time是20081001到20091031之間的。官方文檔:http://wiki.apache.org/solr/CommonQueryParameters
q.op – 覆蓋schema.xml的defaultOperator(有空格時用」AND」仍是用」OR」操做邏輯),通常默認指定
df – 默認的查詢字段,通常默認指定
qt – (query type)指定那個類型來處理查詢請求,通常不用指定,默認是standard。
其它
indent – 返回的結果是否縮進,默認關閉,用 indent=true|on 開啓,通常調試json,php,phps,ruby輸出纔有必要用這個參數。
version – 查詢語法的版本,建議不使用它,由服務器指定默認值。
數據量小的時候,一臺Solr服務器能徹底勝任這份工做,隨着咱們應用慢慢長大,訪問也愈來愈多,一臺Solr服務器的弊病也逐漸顯現如查詢變慢了,機器宕機就沒法繼續提供服務,因而乎咱們引入了Solr集羣,經過前端負載均衡和索引Replication來分擔一臺機器的壓力,這樣既能提升查詢速度,也能避免單機故障問題並且是可伸縮的解決方案,一切看起來很OK,問題也暫時解決了,可是好景不長,隨着應用的發展,數據也在與日俱增,須要索引的數據也愈來愈多,索引文件變得愈來愈龐大,Replication索引變得愈來愈低效高成本,每一個Solr實例都保存全量大索引數據的方式顯然又成了系統性能和可伸縮性的瓶頸,若是能將大索引文件切分,分佈在集羣中不一樣機器中且查詢的準確性和可用性又不會受到影響該是件多麼美好的事情啊,因而SolrCloud出現了...
SolrCloud是基於ZooKeeper和Solr的分佈式解決方案,爲Solr添加分佈式功能,用於創建高可用,高伸縮,自動容錯,分佈式索引,分佈式查詢的Solr服務器集羣;SolrCloud並不是一個新的軟件發佈包,而是Solr4.0版本新增組件用於跟ZooKeeper配合提供分佈式功能,部署時只是修改啓動配置;
安裝過程
1. 準備zookeeper環境,這裏再也不講zookeeper的安裝、部署
2.到Apache官網下載Solr-5.2.1安裝包
3. 進入到Solr文件的目錄,執行如下命令從壓縮包中抽出安裝腳本:
tar -xvzf solr-5.2.1.tgz solr-5.2.1/bin/install_solr_service.sh --strip-components=2
4. 運行安裝腳本
執行如下命令安裝Solr:
./install_solr_service.sh solr-5.2.1.tgz -i /usr/solr/solr5 -d /usr/solr/solr5 -u solr -s solr -p 8983
或者執行如下命令按照默認值安裝:
./install_solr_service.sh solr-5.2.1.tgz
其實也能夠直接解壓安裝包,而後自定義配置便可。
5.修改配置
執行如下命令編輯solr.in.sh文件:
vim /usr/solr5/solr.in.sh
參照以下進行修改:
SOLR_JAVA_MEM="-Xms1G -Xmx1G",內存限制能夠按照須要設定。
ZK_HOST=" 127.0.0.1:2181, 127.0.0.1:2182, 127.0.0.1:2183"
6.按照上述步驟在其餘節點執行安裝
啓動Solr服務並驗證
1. 在Solr集羣中各節點執行如下命令啓動Solr服務:
service solr start
這裏解釋一下涉及到的一些概念
collection:solrcloud集羣中邏輯意義上的完整索引,一般被劃分爲一個或多個shard(片),這些分片使用相同的config set。若是shard數超過一個,它就是分佈式索引,solrcloud讓你經過collection名稱引用它,而不須要關心分佈式檢索時使用shard相關的參數。
Core:solr core,一個solr實例中能夠包含多個core,每一個core能夠獨立完成索引和查詢功能。collection和core的對應關係有點複雜,下邊有張圖,能很好的解釋他們之間的關係,core能夠理解爲物理層面的分類;collection能夠理解爲邏輯層面的分類。在solrcloud的世界裏,core被映射/抽象/關聯成replicas(複本),多個複本之間經過zookeeper來管理,而且,會自動選舉出一個leader結點,這都是zookeeper的內容了。
Leader:贏得選舉的Shard replicas。每一個Shard有多個Replicas,這幾個Replicas須要選舉來肯定一個Leader。選舉能夠發生在任什麼時候間,可是一般他們僅在某個Solr實例發生故障時纔會觸發。當索引documents時,SolrCloud會傳遞它們到此Shard對應的leader,leader再分發它們到所有Shard的replicas。
Replicas:Shard的一個拷貝。每一個Replica存在於Solr的一個Core中。一個命名爲「test」的collection以numShards=1建立,而且指定replicationFactor設置爲2,這會產生2個replicas,也就是對應會有2個Core,每一個在不一樣的機器或者Solr實例。一個會被命名爲test_shard1_replica1,另外一個命名爲test_shard1_replica2。它們中的一個會被選舉爲Leader。
Shard:Collection的邏輯分片。每一個Shard被化成一個或者多個replicas,經過選舉肯定哪一個是Leader。
建立分片和複本
建立collection並設置分片、和設置複本數目
bash /opt/solr/bin/solr create_collection -c farmer -n farmer -d /opt/solr-5.3.1/server/solr/configsets/sample_techproducts_configs/conf -shards 1 -replicationFactor 3
參數說明能夠用如下命令查看:
bash /opt/solr/bin/solr create_collection -help
參數解釋:
-c:建立collection的名字
-n:配置文件的文件夾名稱
-d:須要上傳到zookeeper上的配置文件目錄
-shards:分片的數目
-replicationFactor:建立的collection的複本的數目
就是這種方式建立出來的集羣core名字和collection不一樣,是zookeeper默認拼接的,以下圖:
並且,core的名字爲:collection名字_shardX_replicaX,X爲數字。看上去很怪。
第二種種方式建立collection
先上傳配置文件到zookeeper
bash /opt/solr-5.3.1/server/scripts/cloud-scripts/zkcli.sh -zkhost 127.0.0.1:2181 -cmd upconfig -n worker -d /opt/solr-5.3.1/server/solr/configsets/sample_techproducts_configs/conf
參數解釋:
-zkhost:zookeeper的地址
-cmd:bootstrap, upconfig(更新配置文件,zookeeper上沒有就上傳;有就跟新,以-n的值爲collection辨別), downconfig(下載配置文件), linkconfig, makepath, put, putfile,get,getfile, list, clear,其他的命令沒用過,等用過了再更新
-n:配置文件的名字,最終被用做collection的名字
-d:配置文件所在的目錄,這裏我用的「/opt/solr-5.3.1/server/solr/configsets/sample_techproducts_configs/conf 」solr默認的配置文件;可使用本身的配置文件目錄,通常此配置文件的目錄結構以下:
conf
├── currency.xml
├── lang
│ └── stopwords_en.txt
├── protwords.txt
├── _rest_managed.json
├── schema.xml
├── solrconfig.xml
├── stopwords.txt
└── synonyms.txt
這裏須要注意的是,-zkhost,能夠只寫一個結點。
而後,逐個增長複本,我這裏把:name、instanceDir、collection、shard、collection.configName都命名成同樣了,
http://192.168.226.128:8985/solr/admin/cores?action=CREATE&name=worker&instanceDir=worker&dataDir=data&collection=worker&shard=worker&collection.configName=worker http://192.168.226.128:8984/solr/admin/cores?action=CREATE&name=worker&instanceDir=worker&dataDir=data&collection=worker&shard=worker&collection.configName=worker http://192.168.226.128:8983/solr/admin/cores?action=CREATE&name=worker&instanceDir=worker&dataDir=data&collection=worker&shard=worker&collection.configName=worker
參數含義:
name:新建core的名稱
建立的core的命名規則:
coreName_shardName_replicaN
例如:建立pscp的集合,2個分片,每一個分片上面有兩個備份
則命名以下:
pscp_shard1_replica1
pscp_shard1_replica2
pscp_shard2_replica1
pscp_shard2_replica2
shard:指定一個分配id,這個core將掛在那個分片上(隨便寫,若是尚未這個id,第一次會幫你建立)
collection.configName:從zookeeper中指定一份配置文件
instanceDir和dataDir:從下圖看出他的含義
命名規則:instanceDir與name的名稱相同,dataDir:統一建議命名爲data
效果以下圖:
更新solrcloud配置的方法
更新集羣配置文件就是更新zookeeper上的配置文件,
bash /opt/solr-5.3.1/server/scripts/cloud-scripts/zkcli.sh -zkhost 127.0.0.1:2181 -cmd upconfig -n worker -d /opt/solr-5.3.1/server/solr/configsets/sample_techproducts_configs/conf
更新完配置文件以後,須要從新加載配置文件才能生效
http://192.168.226.128:8985/solr/admin/collections?action=RELOAD&name=worker
1,在maven工程環境下,pom.xml增長引用
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>5.3.1</version>
</dependency>
2,根據業務邏輯若是簡單,能夠直接使用SolrQuery,若是複雜能夠實現本身的SolrQuery;同時還要實現本身的QueryResponse,處理相應的篩選項、分頁、返回字段等。
3,若是使用的是單點的solr實例,須要直連指定的solr實例,須要指定ip、端口、core
HttpSolrClient solrClient = new HttpSolrClient(「http://localhost:8983/solr/core_name」);
4,若是使用的集羣形式的solr,須要指定zookeeper
CloudSolrClient cloudSolrClient = new CloudSolrClient(「127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183/solr」);
若是須要額外的驗證和參數用cloudSolrClient = new CloudSolrClient(zkHost, closeableHttpClient);
closeableHttpClient = HttpClientUtil.createClient(params);
同時,查詢到時候,須要指定collection
QueryResponse response = solrClient.query("collection", solrQuery);
寫在這裏呢,主要是提示讀者注意,也許你根本不會犯此類錯誤,就是在部署完solr以後,通常咱們都是默認root帳戶去安裝和部署,完事以後呢建立core或collection的時候老是提示找不到文件夾,或沒法讀取某文件,這是由於,solr服務默認建立solr用戶,啓動solr的用戶也是solr。solr用戶看不到root帳戶建立的core或collection文件包括目錄。因此,在部署完以後,切到solr用戶啓動solr和建立新的core或colletion。