學習搭建solr有感(第三期)
第三期也出來了……
這次的問題是將solr整合到專案當中出現的問題。 首先,導包!這個我一定要強調一下! 如果,通過pom的方式導包失敗,那麼請嘗試一下下面這個方式
<groupId>org.apache.solr</groupId> <artifactId>solr-solrj</artifactId> <version>4.7.1</version> <scope>system</scope> <systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/solr-solrj-4.7.1.jar</systemPath> </dependency> <dependency> <groupId>org.apache.solr</groupId> <artifactId>solr-core</artifactId> <version>4.7.1</version> <scope>system</scope> <systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/solr-core-4.7.1.jar</systemPath> </dependency>
請注意一點,在systempath這地方填寫的地址是你的solr依賴存放的絕對路徑。 然後,在使用的時候它也不會立刻出現,還需要確認一下,我就是因為沒有進行匯入確認,結果白白浪費了一個上午的時間。 當你確認過後,它自然會出現在你maven目錄裡面了 接下來是第二點,也是比較關鍵的一點,那就是程式碼的編寫。 在這個地方,我碰到了一些疑惑。是關於schema.xml的,在最開始關注的那個攻略當中,我並沒有留心它對於solr的構築方式。 我十分單純的認為引入jar包,就可以在專案當中同時構築一個伺服器……結果,在簡單的查詢之後,我發現……事實並不是這樣。 很多solr跟java專案整合的攻略當中,他們更多的是告訴你如何寫程式碼,卻沒有跟你說這個程式碼是執行在什麼地方,需要跟什麼配合 實際上,這些程式碼都是建立在你已經成功構築好solr伺服器的基礎之上的……在我前兩篇有感中一直提到的那個攻略中,它的java程式碼裡面出現了一個讓我陌生又熟悉的單詞 “product_keywords” 這個單詞在全文中只出現過4次,而前三次都是在搭建solr伺服器的時候才出現,而現在又一次出現在了java程式碼中。 我本著這到底是啥玩意,為啥要這麼寫的態度。去百度了…… 而百度的結果就是,哪怕你已經引入了jar包,如果沒有搭建好solr的伺服器,那也是白費勁…… 就這樣,我又掉頭去研究schema.xml文件的構成以及如何建立自己的欄位。 這裡我推薦兩篇文章,大家可以看看
一篇是將solr部署的,但沒有之前推薦的那個手把手寫的詳細(並非圖文並茂,而是圖片都碎了……) 具體看下來才發現它的solr好像是搭建在linux上面的 另外一邊則是我主要看的schema.xml的相關介紹。 在solr部署的文章當中,我找到了最簡略的schema.xml檔案內容,而不是solr壓縮包裡面那個又有註釋又有外國分詞器的文件 而在這個地方我又碰到了新的坑 各位看看我下面的兩段程式碼
<?xml version="1.0" encoding="UTF-8" ?> <schema name="example" version="1.5"> <fields> <field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" /> <field name="loginname" type="long" indexed="true" stored="true" /> <field name="nickname" type="text_ik" indexed="true" stored="true" /> <field name="registerdate" type="date" indexed="true" stored="true" /> <field name="name" type="text_ik" indexed="true" stored="true" /> <field name="releaseowner" type="text_ik" indexed="true" stored="true" /> <field name="information1" type="text_ik" indexed="true" stored="true" /> <field name="addrprovince" type="text_ik" indexed="true" stored="true"/> <field name="addrcity" type="text_ik" indexed="true" stored="true" /> <field name="addrcounty" type="text_ik" indexed="true" stored="true" /> <field name="text" type="text_ik" indexed="true" stored="false" multiValued="true"/> <copyField source="loginname" dest="text"/> <copyField source="nickname" dest="text" /> <copyField source="registerdate" dest="text" /> <copyField source="name" dest="text"/> <copyField source="releaseowner" dest="text" /> <copyField source="information1" dest="text" /> <copyField source="addrprovince" dest="text"/> <copyField source="addrcity" dest="text" /> <copyField source="addrcounty" dest="text" /> <field name="_version_" type="long" indexed="true" stored="true"/> </fields> <uniqueKey>id</uniqueKey> <types> <fieldType name="string" class="solr.StrField" sortMissingLast="true" /> <fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/> <fieldType name="text" class="solr.TextField" /> <fieldType name="date" class="solr.TrieDateField" precisionStep="0" positionIncrementGap="0"/> <fieldType name="text_ik" class="solr.TextField"> <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/> </fieldType> </types> </schema>
這段是能夠進行全文搜尋的程式碼
<schema name="example" version="1.5">
<fields>
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<field name="loginname" type="long" indexed="true" stored="true" />
<field name="nickname" type="text_ik" indexed="true" stored="true" />
<field name="registerdate" type="date" indexed="true" stored="true" />
<field name="name" type="text_ik" indexed="true" stored="true" />
<field name="releaseowner" type="text_ik" indexed="true" stored="true" />
<field name="information1" type="text_ik" indexed="true" stored="true" />
<field name="addrprovince" type="text_ik" indexed="true" stored="true"/>
<field name="addrcity" type="text_ik" indexed="true" stored="true" />
<field name="addrcounty" type="text_ik" indexed="true" stored="true" />
<field name="_version_" type="long" indexed="true" stored="true"/>
<field name="text" type="text_ik" indexed="true" stored="false" multiValued="true"/>
<copyfield source="name" dest="text"/>
<copyfield source="releaseowner" dest="text"/>
<copyfield source="nickname" dest="text"/>
<copyfield source="information1" dest="text"/>
<copyfield source="addrprovince" dest="text"/>
<copyfield source="addrcity" dest="text"/>
<copyfield source="addrcounty" dest="text"/>
</fields>
<uniqueKey>id</uniqueKey>
<types>
<fieldType name="double" class="solr.TrieDoubleField" precisionStep="0" positionIncrementGap="0"/>
<fieldType name="date" class="solr.TrieDateField" precisionStep="0" positionIncrementGap="0"/>
<fieldType name="string" class="solr.StrField" sortMissingLast="true" />
<fieldType name="text" class="solr.TextField" />
<fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/>
<fieldType name="text_ik" class="solr.TextField">
<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
</types>
</schema>
這段是不能進行全文搜尋的程式碼 兩段程式碼我進行了簡單的比較,並沒有發現什麼不對的地方,也可能是copyfield欄位寫的不夠多,但上下兩端程式碼都可以正常啟動solr伺服器。 這裡我還有說一個坑。 全文搜尋的欄位輕易不要改動,不然就會發生我上面的事情,一段可以全文搜尋,一段不能全文搜尋。 這裡再提一篇文章,它說了全文搜尋這個bug出現的時候,應該如何解決
要麼你就把全文搜尋的名字定義成“text”不變,不然就把solrconfig.xml裡面所有涉及到全文搜尋的欄位都改成你想要的欄位…… 哪個簡單一些,不言而喻…… 今天暫時就這些東西,我還要繼續去將solr跟java專案進行整合,目前已經完成十分之一……需要加快進度了