標籤:mongodb solr 搜尋引擎 ubuntu json
環境:
Ubuntu 12.04 Solr 5.1.0 MongoDB db version:v2.0.4
1. Solr配置與MongoDB的安裝
Solr安裝配置到目前已經非常簡單,參考官方文檔:http://lucene.apache.org/solr/quickstart.html,官方文檔中用的是cloud這個範例(-e 指定),最後,我採用的是techproducts,基本命令如下:
/:$ ls solr*solr-5.1.0.zip/:$ unzip -q solr-5.1.0.zip/:$ cd solr-5.1.0/bin/solr start -e techproducts -noprompt
按照官方文檔所說,如果你想用完後關閉solr並清除這個範例底下的資料,那麼請運行
bin/solr stop -all ; rm -Rf example/techproducts/
之所以把這幾條命令提出來,那是因為在整個過程中你可能不停的要啟動,關閉,清除,一直到ok。
此處十分想吐槽網上那些業餘的配置文檔,凡是步驟一大片的文檔最好不要看,否則整到頭,到最後難過的還是你。
MongoDB的安裝在Ubuntu下顯得異常傻瓜,apt-get即是最好。
2. Solr與MongoDB的整合
從Solr官方給的quickstart文檔上來看,它可以搜尋xml, json, csv等多種文檔,但絲毫看不出這東西還能跟MongoDB整合,但是萬能的人類總是能想辦法把他們弄到一起,或許真的有全能神吧。
還好,leader說:可以的,隨手扔給了我一個連結 http://www.cnblogs.com/sysuys/p/3403670.html。但是當我看到裡面的Solr版本是4.5時,我的內心是崩潰的,但是沒有辦法了,似乎也找不到更好的辦法了。
於是,我發揮一不怕死,二不怕苦的精神,我硬著頭皮往下讀,突然,一片綠洲出現在我的眼前,尼瑪這個文檔裡面有個github地址,而且正是用的github這個東西啊。
對,就是這個mongo-connector https://github.com/10gen-labs/mongo-connector/wiki/Getting-Started,瞧,我們又找到了一個官方文檔了,嗯,靠譜。但最後的結果讓我決定我還是得整理出來一個適合自身國情發展需要的配置文檔來。
算了,廢話太多,直接步驟吧:
1). 建立MongoDB的replica set(複本集,大概是這麼翻譯的).
在使用apt-get安裝完MongoDB之後,系統會自行啟動MongoDB的伺服器,我們將其殺死:
pkill mongod
然後指定複本集啟動:
mongod --replSet myDevReplSet
MongoDB的終止和啟動似乎就是這麼簡單,你要是像上面這樣啟動,它就在前台運行,你需要再次結束時,直接Ctrl+C,如果啟動時加上&,它就在後台運行,當然也就得用pkill或者kill了。
然後在mongo shell下對複本集進行初始化:
[email protected]:~/solr-5.1.0$ mongoMongoDB shell version: 2.0.4connecting to: testPRIMARY> rs.initiate()
這個時候MongoDB這一邊就弄好了,很簡單,就是要加一個複本集。
2). 安裝mongo-connector
安裝參考https://github.com/10gen-labs/mongo-connector,十分簡單,一條命令:
pip install mongo-connector
如果提示沒有python-pip,apt-get一下便好。mongo-connector這個中介軟體好了,但是先別急著用,因為這個東西要讀取Solr的設定檔,所以Solr中的一些地方弄好了,再用這個就又只是一條命令罷了。
3). Solr一端的配置
這個要是參考mongo-connector及其他文章可就坑大了。
a>
首先它們會讓你修改Solr的schema.xml這個檔案,但是在熟悉Solr的真箇過程中,連這個檔案的毛都沒見到,去哪修改啊。
沒有辦法,這個時候找也得找,不找也得找,使用強大的find命令吧:
[email protected]:~/solr-5.1.0$ find . -name "schema.xml"./server/solr/configsets/basic_configs/conf/schema.xml./server/solr/configsets/sample_techproducts_configs/conf/schema.xml./example/example-DIH/solr/tika/conf/schema.xml./example/example-DIH/solr/mail/conf/schema.xml./example/example-DIH/solr/solr/conf/schema.xml./example/example-DIH/solr/rss/conf/schema.xml./example/example-DIH/solr/db/conf/schema.xml./example/techproducts/solr/techproducts/conf/schema.xml
好的,對應我們前面的techproducts範例,看起來結果中有兩條相關,有這個關鍵字嘛,那大概就是這兩個了,當然,這時候根據經驗來說應該選擇修改第一個的,因為前面有提到能清除使用者的範例,也就是說第二個相關的schemal.xml是可以刪除的,立即產生不好的預感,這個東西肯定是Solr開啟時自動產生的,而怎麼產生呢,絕大可能是上述第一個的位置schema.xml的副本,後面驗證了,果然沒錯。
進入正題,找到修改的地方了,那麼,修改吧:
開啟
vi ./server/solr/configsets/sample_techproducts_configs/conf/schema.xml
將
<uniqueKey>id</uniqueKey>
替換成
<uniqueKey>_id</uniqueKey>
再添加
<field name="_id" type="string" indexed="true" stored="true" /><field name="_ts" type="long" indexed="true" stored="true" /><field name="ns" type="string" indexed="true" stored="true"/>
最好是這幾處放在一塊,做個標記,以後方便查詢嘛,另外,此處存坑:
注釋掉原來的
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
不然往Solr中添加一個json,或者xml都會要求有這個欄位id,因為required="true"嘛,這些東西都是我遇到問題後發現的。
schema.xml的修改就是這些。
b>
此處又存在另外一個坑,其實我們還需要修改solrconfig.xml,要說這些東西都怎麼發現的,被坑了之後碰出來的都。
開啟:
vi ./server/solr/configsets/sample_techproducts_configs/conf/solrconfig.xml
將
<requestHandler name="/admin/luke" class="solr.admin.LukeRequestHandler" />
解注釋,這個東西要被mongo-connector用到,mongo-connector會請求擷取上面的schema.xml,正是這個Handler來處理這個請求,所以說這個很重要。而似乎官方文檔認為我們這個就是預設開啟的,並沒有提到此事,所以說巨坑!
c>
設定檔就是上面兩個,就是這塊比較複雜,不敢保證其他版本的Solr也是這樣。
最後,我們按照之前說的關閉Solr,清除example/techproducts目錄,重新再次啟動Solr,重啟techproducts範例會產生一些錯誤,那是因為修改了schema.xml,裡面uniqueKey變成了_id,而不是id,所以會產生這些錯誤,但這些都可以忽略,不產生錯誤就說明有問題。之後你會發現,那兩個設定檔被複製成了exmaple/techproducts這個範例的設定檔,就像上文說的。
OK,Solr一端的配置完畢。
4). 使用mongo-connector串連Solr與MongoDB
如果你再一次參考github上的官方文檔,恭喜,你又跳了一次坑,在目前的情況下,請運行:
mongo-connector --auto-commit-interval=1 -d solr_doc_manager -t http://localhost:8983/solr/techproducts
注意,與官方不同的正是這個-t後面的連結,因為我們用的是techproducts範例,所以後面也應該加上這個名字,其實一開是完全不知到這個連結是幹啥的,完全是各種誤打誤撞,滑鼠點點出來的,這個--auto-commit-interval參數設為0,從實驗結果來看,應該是一直都不會把MongoDB中的資料寫傳到Solr那邊的意思,似乎與官方文檔完全相反,有待繼續驗證。
最終效果就是你在MongoDB中添加一條資料,1s之後在Solr中用*:*查詢,就會顯示出更新。
論搜尋引擎solr與MongoDB的整合