溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

springboot 中怎么整合solr

發(fā)布時(shí)間:2021-07-30 14:25:10 來(lái)源:億速云 閱讀:241 作者:Leah 欄目:大數(shù)據(jù)

springboot 中怎么整合solr ,相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

一、版本介紹:

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)慎選用與之一樣版本)

二、solr服務(wù)器搭建

下載
  • 1.tomcat8的下載不贅述;

  • 2.solr下載: 進(jìn)入solr官網(wǎng) ,找歷史版本下載v7.4.0的壓縮包,事實(shí)上 solr archive 本人并沒(méi)有訪(fǎng)問(wèn)成功,
    如果網(wǎng)友和我一樣訪(fǎ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代替此全路徑)


配置solrhome
  • 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下 springboot 中怎么整合solr

  • 4.復(fù)制solr-7.4.0\server\solr下所有文件至solrhome下 springboot 中怎么整合solr

貼出具體代碼如下:

  <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&amp;serverTimezone=UTC"
              user="username"
              password="password" />
    <document>
	<!-- entity name必須給值 query為查詢(xún)語(yǔ)句 field-column對(duì)應(yīng)數(shù)據(jù)庫(kù)列 name是查詢(xún)結(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 springboot 中怎么整合solr

如果配置了ik分詞器可以按此修改: <field name="demoName">


配置tomcat
  • 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ù)制到該目錄下)
    springboot 中怎么整合solr springboot 中怎么整合solr

修改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資源的訪(fǎng)問(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分詞器的集成

將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>

三、solr體驗(yàn)

啟動(dòng)tomcat,訪(fǎng)問(wèn) http://localhost:8888/solr/index.html#/ springboot 中怎么整合solr

用ik解析中文語(yǔ)句,匹配測(cè)試如下 springboot 中怎么整合solr

檢索測(cè)試


三、springboot中使用solr

配置pom
 		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-solr</artifactId>
		</dependency>
配置yml
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è)
編寫(xiě)一個(gè)demo,代碼如下:

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("你在搞什么掃話(huà)題嘎嘎");
		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í)行下述查詢(xún)會(huì)報(bào)錯(cuò),
	 * 無(wú)奈只能這么玩了,若網(wǎng)友有好的解決方法,請(qǐng)?jiān)谙路搅粞?
	 * 或是調(diào)用SolrCrudRepository中的查詢(xún)方法(我這里需要根據(jù)具體字段查詢(xún)且分頁(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è)置查詢(xún)條件
		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();
		//獲取查詢(xún)到的數(shù)據(jù)總量
		long numFound = results.getNumFound();
		if(numFound <= 0) {
			//如果小于0,表示未查詢(xún)到任何數(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ō)明

文件夾描述
contribsolr的一些插件,用于擴(kuò)展solr的功能
dist該文件夾下包含build過(guò)程中產(chǎn)生的war和jar文件,以及相關(guān)的依賴(lài)文件
docsolr的文檔
examplesolr官方提供的一些示例程序,簡(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/> springboot 中怎么整合solr

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)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI