1. 程式人生 > >學習搭建solr有感(第三期)

學習搭建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專案進行整合,目前已經完成十分之一……需要加快進度了