springboot 中怎么整合solr ,相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。
成都創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),調(diào)兵山企業(yè)網(wǎng)站建設(shè),調(diào)兵山品牌網(wǎng)站建設(shè),網(wǎng)站定制,調(diào)兵山網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷(xiāo),網(wǎng)絡(luò)優(yōu)化,調(diào)兵山網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專(zhuān)業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
jdk1.8
tomcat8
springboot 2.1.3RELEASE(這里有坑,詳見(jiàn)下文)
solr 7.4.0 (沒(méi)有選擇最新的版本,是因?yàn)轫?xiàng)目的boot版本是2.1.3,其對(duì)應(yīng)的solr-solrj.jar版本是7.4.0,為避免出現(xiàn)不可預(yù)料不可抗拒不可解決的問(wèn)題,謹(jǐn)慎選用與之一樣版本)
1.tomcat8的下載不贅述;
2.solr下載: 進(jìn)入solr官網(wǎng) ,找歷史版本下載v7.4.0的壓縮包,事實(shí)上 solr archive 本人并沒(méi)有訪問(wèn)成功,
如果網(wǎng)友和我一樣訪問(wèn)不了,那只能說(shuō)明你的臉黑,而官網(wǎng)應(yīng)該是瓦掉了,所以本人肯定是沒(méi)有問(wèn)題的,下面把從網(wǎng)上肆虐而來(lái)的一個(gè)資源分享一下,附帶了一個(gè)ik分詞器的壓縮包,后面有用: 百度網(wǎng)盤(pán) 提取碼:6mhk
1.解壓solr至 D:\JAVA\solr\solr-7.4.0\(下文均以solr-7.4.0代替此全路徑)
2.解壓tomcat至 D:\JAVA\solr\apache-tomcat-8.5.42(下文均以tomcat-8.5.42代替此全路徑)
1.在路徑D:\JAVA\solr\下新建文件夾solrhome(下文均以solrhome代替此全路徑)
2.在solrhome下新建logs文件夾(記下此路徑:D:\JAVA\solr\solrhome\logs)
3.復(fù)制文件夾solr-7.4.0\contrib和solr-7.4.0\dist至solrhome下
4.復(fù)制solr-7.4.0\server\solr下所有文件至solrhome下
貼出具體代碼如下:
<lib dir="${solr.install.dir:../}/contrib/extraction/lib" regex=".*\.jar" /> <lib dir="${solr.install.dir:../}/dist/" regex="solr-cell-\d.*\.jar" /> <lib dir="${solr.install.dir:../}/contrib/clustering/lib/" regex=".*\.jar" /> <lib dir="${solr.install.dir:../}/dist/" regex="solr-clustering-\d.*\.jar" /> <lib dir="${solr.install.dir:../}/contrib/langid/lib/" regex=".*\.jar" /> <lib dir="${solr.install.dir:../}/dist/" regex="solr-langid-\d.*\.jar" /> <lib dir="${solr.install.dir:../}/contrib/velocity/lib" regex=".*\.jar" /> <lib dir="${solr.install.dir:../}/dist/" regex="solr-velocity-\d.*\.jar" /> <lib dir="${solr.install.dir:../}/dist/" regex="ojdbc\d.*\.jar" /> <lib dir="${solr.install.dir:../}/dist/" regex="solr-dataimporthandler\d.*\.jar" />
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"> <lst name="defaults"> <!-- 這個(gè)文件名配置有用 --> <str name="config">data-config.xml</str> </lst> </requestHandler>
7.在solrhome\new_core\conf下新建文件data-config.xml(文件名與上述xml配置保持一致),文件內(nèi)容如下:
<?xml version="1.0" encoding="UTF-8"?> <dataConfig> <!-- 數(shù)據(jù)庫(kù)基本配置,需要將對(duì)應(yīng)數(shù)據(jù)庫(kù)驅(qū)動(dòng)放到tomcat下,見(jiàn)后續(xù)操作 --> <dataSource name="source1" type="JdbcDataSource" driver="com.MySQL.jdbc.Driver" url="jdbc:mysql://localhost:3306/dbname?useSSL=true&serverTimezone=UTC" user="username" password="password" /> <document> <!-- entity name必須給值 query為查詢語(yǔ)句 field-column對(duì)應(yīng)數(shù)據(jù)庫(kù)列 name是查詢結(jié)果返回的名稱(chēng),類(lèi)似mybatis --> <entity name="test_demo" dataSource="source1" pk="id" query="SELECT id,name FROM demo"> <field column='name' name='demoName' /> <field column='id' name='id' /> </entity> </document> </dataConfig>
8.修改conf\managed-schema
如果配置了ik分詞器可以按此修改: <field name="demoName">
1.將solr-7.4.0\server\solr-webapp\下的webapp文件夾復(fù)制到tomcat-8.5.42\webapps 并且修改名稱(chēng)為solr
2.在tomcat-8.5.42\webapps\solr\WEB-INF\下新建classes包,將solr-7.4.0\server\resources\log4j2.xml復(fù)制到classes包下
3.將下圖標(biāo)注jar復(fù)制到tomcat-8.5.42\webapps\solr\WEB-INF\lib(數(shù)據(jù)庫(kù)驅(qū)動(dòng)包可以在自己的web項(xiàng)目里找,找到后也復(fù)制到該目錄下)
修改D:\JAVA\solr\apache-tomcat-8.5.42\webapps\solr\WEB-INF\web.xml如下:
<!-- 放開(kāi)注釋 修改solrhome地址 --> <env-entry> <env-entry-name>solr/home</env-entry-name> <!-- 這個(gè)solrhome地址即上述創(chuàng)建的solrhome文件夾路徑 --> <env-entry-value>D:\JAVA\solr\solrhome</env-entry-value> <env-entry-type>java.lang.String</env-entry-type> </env-entry> <!-- 此處省略部分配置代碼 --> <!-- 找到最后注釋掉這一塊的代碼,據(jù)說(shuō)是因?yàn)榇伺渲孟拗屏藢?duì)solr資源的訪問(wèn) --> <!-- <security-constraint> <web-resource-collection> <web-resource-name>Disable TRACE</web-resource-name> <url-pattern>/</url-pattern> <http-method>TRACE</http-method> </web-resource-collection> <auth-constraint/> </security-constraint> <security-constraint> <web-resource-collection> <web-resource-name>Enable everything but TRACE</web-resource-name> <url-pattern>/</url-pattern> <http-method-omission>TRACE</http-method-omission> </web-resource-collection> </security-constraint>-->
修改tomcat端口號(hào) ....conf\server.xml 為8888
<Connector port="8888">
修改D:\JAVA\solr\apache-tomcat-8.5.42\bin\catalina.bat(最后一行是新添加的)
if not "%JSSE_OPTS%" == "" goto gotJsseOpts set JSSE_OPTS="-Djdk.tls.ephemeralDHKeySize=2048" :gotJsseOpts set "JAVA_OPTS=%JAVA_OPTS% %JSSE_OPTS%" set "JAVA_OPTS=%JAVA_OPTS% -Dsolr.log.dir=D:\JAVA\solr\solrhome\logs"
將ik分詞器解壓出來(lái)的兩個(gè)jar放到tomcat-8.5.42\webapps\solr\WEB-INF\lib下,然后配置solrhome\new_core\conf\managed-schema 在文件最后添加:
<schema> <!-- 省略原有代碼 --> <fieldType name="text_ik" class="solr.TextField" positionIncrementGap="100"> <analyzer type="index"> <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false"/> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> <analyzer type="query"> <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true"/> <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> </fieldType> </schema>
啟動(dòng)tomcat,訪問(wèn) http://localhost:8888/solr/index.html#/
用ik解析中文語(yǔ)句,匹配測(cè)試如下
檢索測(cè)試
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-solr</artifactId> </dependency>
spring: data: solr: host: http://127.0.0.1:8888/solr
注意:如果你使用的是springboot 2.1.3RELEASE,按照下述操作步驟走完,啟動(dòng)項(xiàng)目會(huì)報(bào)錯(cuò),
提示: Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true
,
據(jù)說(shuō)是springboot 2.1.3RELEASE的一個(gè)bug,需要在yml中配置一下:
spring: main: allow-bean-definition-overriding: true #當(dāng)遇到同樣名字的時(shí)候,是否允許覆蓋注冊(cè)
1.entity:
import org.apache.solr.client.solrj.beans.Field; import org.springframework.data.solr.core.mapping.SolrDocument; @SolrDocument(collection="new_core") public class SolrDemo { @org.springframework.data.annotation.Id private String id; @Field("demoName") private String name; //省略getset }
2.dao:
import org.jeecg.modules.demo.test.entity.SolrDemo; import org.springframework.data.solr.repository.SolrCrudRepository; import org.springframework.stereotype.Repository; @Repository public interface SolrDemoRepository extends SolrCrudRepository<SolrDemo, String>{ }
3.service接口
import java.io.IOException; import java.util.List; import org.apache.solr.client.solrj.SolrServerException; import org.jeecg.modules.demo.test.entity.SolrDemo; public interface ISolrService { void addDemo(); void updatedemo(); void deletedemo(); List<SolrDemo> queryList(String keyword) throws SolrServerException, IOException; }
4.service實(shí)現(xiàn)類(lèi)
import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; import javax.annotation.Resource; import org.apache.solr.client.solrj.SolrClient; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.impl.HttpSolrClient; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.common.SolrDocument; import org.apache.solr.common.SolrDocumentList; import org.jeecg.modules.demo.test.entity.SolrDemo; import org.jeecg.modules.demo.test.mapper.SolrDemoRepository; import org.jeecg.modules.demo.test.service.ISolrService; import org.springframework.stereotype.Service; @Service public class SolrServiceImpl implements ISolrService { @Resource private SolrDemoRepository solrDemoRepository; @Override public void addDemo() { //正常情況應(yīng)該在方法中定義參數(shù)將實(shí)體傳進(jìn)來(lái),此處demo簡(jiǎn)單寫(xiě) SolrDemo demo = new SolrDemo(); demo.setId("001"); demo.setName("俺們都是打醬油的哈哈破"); solrDemoRepository.save(demo); } @Override public void updatedemo() { SolrDemo demo = new SolrDemo(); demo.setId("001"); demo.setName("你在搞什么掃話題嘎嘎"); solrDemoRepository.save(demo); } @Override public void deletedemo() { solrDemoRepository.deleteById("001"); } @Override public List<SolrDemo> queryList(String keyword) throws SolrServerException, IOException { /* * 這里有個(gè)坑爹的地方,正常情況可以直接在service里直接注入SolrClient, * 但是因?yàn)閥ml中配置的地址是http://127.0.0.1:8888/solr/,導(dǎo)致注入的SolrClient執(zhí)行下述查詢會(huì)報(bào)錯(cuò), * 無(wú)奈只能這么玩了,若網(wǎng)友有好的解決方法,請(qǐng)?jiān)谙路搅粞? * 或是調(diào)用SolrCrudRepository中的查詢方法(我這里需要根據(jù)具體字段查詢且分頁(yè),歡迎留言貼出示例代碼) * 個(gè)人猜測(cè)應(yīng)該是springboot其進(jìn)行了二次封裝,根據(jù)實(shí)體上的注解實(shí)例化不同的SolrClient? * */ String solrUrl = "http://127.0.0.1:8888/solr/new_core"; SolrClient testSolrClient = new HttpSolrClient.Builder(solrUrl) .withConnectionTimeout(10000) .withSocketTimeout(60000) .build(); SolrQuery query = new SolrQuery(); //設(shè)置查詢條件 query.setQuery("demoName:"+keyword); //按照時(shí)間排序 // query.addSort("create_time", SolrQuery.ORDER.desc); //開(kāi)始頁(yè) query.setStart(0); //一頁(yè)顯示多少條 query.setRows(50); //開(kāi)啟高亮 //query.setHighlight(true); //設(shè)置高亮字段 //query.addHighlightField("demoName"); //前綴 //query.setHighlightSimplePre("<font color='red'>"); //后綴 //query.setHighlightSimplePost("</font>"); //執(zhí)行查找 QueryResponse response = testSolrClient.query(query); SolrDocumentList results = response.getResults(); //獲取查詢到的數(shù)據(jù)總量 long numFound = results.getNumFound(); if(numFound <= 0) { //如果小于0,表示未查詢到任何數(shù)據(jù),返回null return null; }else { List<SolrDemo> list = new ArrayList<SolrDemo>(); //遍歷結(jié)果集 for (SolrDocument doc : results) { //得到每條數(shù)據(jù)的map集合 Map<String, Object> map = doc.getFieldValueMap(); //添加到list for (String key : map.keySet()) { System.out.println("KEY:"+key+",VALUE:"+map.get(key).toString()); } SolrDemo demo = new SolrDemo(); demo.setId(map.get("id").toString()); demo.setName(map.get("demoName").toString()); list.add(demo); } return list; } } }
controller層,就是直接寫(xiě)幾個(gè)請(qǐng)求然后調(diào)用一下service即可,代碼及后續(xù)測(cè)試結(jié)果就不貼出來(lái)了,請(qǐng)自行編寫(xiě)。
1.solr文件說(shuō)明
文件夾 | 描述 |
---|---|
contrib | solr的一些插件,用于擴(kuò)展solr的功能 |
dist | 該文件夾下包含build過(guò)程中產(chǎn)生的war和jar文件,以及相關(guān)的依賴(lài)文件 |
doc | solr的文檔 |
example | solr官方提供的一些示例程序,簡(jiǎn)單介紹下面三個(gè)目錄solr、multicore、webapps |
solr | 該目錄是一個(gè)包含了默認(rèn)配置信息的Solr的Core目錄 |
multicore | 該目錄包含了在Solr的multicore中設(shè)置的多個(gè)Core目錄 |
webapps | 該目錄中包括一個(gè)solr.war,該war可作為solr的運(yùn)行實(shí)例工程 |
2.清除索引文件 <delete><query>*:*</query></delete><commit/>
3.solrHome是solr運(yùn)行的主目錄,其下可以創(chuàng)建多個(gè)solrCore,solrCore單獨(dú)對(duì)外提供一個(gè)搜索服務(wù)。
4.solr.install.dir表示solrCore的位置,需要根據(jù)實(shí)際jar包的位置更改jar包引用路徑
5.solr.data.dir表示索引文件存儲(chǔ)地址 默認(rèn)solrCore/data,一開(kāi)始沒(méi)有,會(huì)自動(dòng)創(chuàng)建,若要修改,找solrconfig.xml文件 <dataDir>${solr.data.dir:}</dataDir>
5.ik分詞器的集成(關(guān)于忽略詞,近義詞等等詳細(xì)配置后續(xù)添加)
看完上述內(nèi)容,你們掌握springboot 中怎么整合solr 的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
名稱(chēng)欄目:springboot中怎么整合solr
網(wǎng)站鏈接:http://aaarwkj.com/article28/igcocp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營(yíng)銷(xiāo)型網(wǎng)站建設(shè)、用戶體驗(yàn)、動(dòng)態(tài)網(wǎng)站、App設(shè)計(jì)、軟件開(kāi)發(fā)、微信公眾號(hào)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)