springboot中怎么整合solr

springboot 中怎么整合solr ,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

成都創(chuàng)新互聯(lián)是一家集網站建設,調兵山企業(yè)網站建設,調兵山品牌網站建設,網站定制,調兵山網站建設報價,網絡營銷,網絡優(yōu)化,調兵山網站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網站。

一、版本介紹:

jdk1.8
tomcat8
springboot 2.1.3RELEASE(這里有坑,詳見下文)
solr 7.4.0 (沒有選擇最新的版本,是因為項目的boot版本是2.1.3,其對應的solr-solrj.jar版本是7.4.0,為避免出現不可預料不可抗拒不可解決的問題,謹慎選用與之一樣版本)

二、solr服務器搭建

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

  • 2.solr下載: 進入solr官網 ,找歷史版本下載v7.4.0的壓縮包,事實上 solr archive 本人并沒有訪問成功,
    如果網友和我一樣訪問不了,那只能說明你的臉黑,而官網應該是瓦掉了,所以本人肯定是沒有問題的,下面把從網上肆虐而來的一個資源分享一下,附帶了一個ik分詞器的壓縮包,后面有用: 百度網盤 提取碼: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.復制文件夾solr-7.4.0\contrib和solr-7.4.0\dist至solrhome下 springboot 中怎么整合solr

  • 4.復制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">
			<!-- 這個文件名配置有用 -->
			<str name="config">data-config.xml</str>
		</lst>
	</requestHandler>
  • 7.在solrhome\new_core\conf下新建文件data-config.xml(文件名與上述xml配置保持一致),文件內容如下:

<?xml version="1.0" encoding="UTF-8"?> 
<dataConfig>
    <!-- 數據庫基本配置,需要將對應數據庫驅動放到tomcat下,見后續(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為查詢語句 field-column對應數據庫列 name是查詢結果返回的名稱,類似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文件夾復制到tomcat-8.5.42\webapps 并且修改名稱為solr

  • 2.在tomcat-8.5.42\webapps\solr\WEB-INF\下新建classes包,將solr-7.4.0\server\resources\log4j2.xml復制到classes包下

  • 3.將下圖標注jar復制到tomcat-8.5.42\webapps\solr\WEB-INF\lib(數據庫驅動包可以在自己的web項目里找,找到后也復制到該目錄下)
    springboot 中怎么整合solr springboot 中怎么整合solr

修改D:\JAVA\solr\apache-tomcat-8.5.42\webapps\solr\WEB-INF\web.xml如下:

<!-- 放開注釋 修改solrhome地址 -->
    <env-entry>
       <env-entry-name>solr/home</env-entry-name>
       <!-- 這個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>
	
<!-- 此處省略部分配置代碼 -->
	
<!-- 找到最后注釋掉這一塊的代碼,據說是因為此配置限制了對solr資源的訪問 -->
<!-- <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端口號 ....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分詞器解壓出來的兩個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體驗

啟動tomcat,訪問 http://localhost:8888/solr/index.html#/ springboot 中怎么整合solr

用ik解析中文語句,匹配測試如下 springboot 中怎么整合solr

檢索測試


三、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,按照下述操作步驟走完,啟動項目會報錯,
提示: Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true,
據說是springboot 2.1.3RELEASE的一個bug,需要在yml中配置一下:

spring:
  main:
    allow-bean-definition-overriding: true #當遇到同樣名字的時候,是否允許覆蓋注冊
編寫一個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實現類

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() {
	//正常情況應該在方法中定義參數將實體傳進來,此處demo簡單寫
		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 {
	/*
	 * 這里有個坑爹的地方,正常情況可以直接在service里直接注入SolrClient,
	 * 但是因為yml中配置的地址是http://127.0.0.1:8888/solr/,導致注入的SolrClient執(zhí)行下述查詢會報錯,
	 * 無奈只能這么玩了,若網友有好的解決方法,請在下方留言
	 * 或是調用SolrCrudRepository中的查詢方法(我這里需要根據具體字段查詢且分頁,歡迎留言貼出示例代碼)
	 * 個人猜測應該是springboot其進行了二次封裝,根據實體上的注解實例化不同的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();
		
		//設置查詢條件
		query.setQuery("demoName:"+keyword);
		
		//按照時間排序
       // query.addSort("create_time", SolrQuery.ORDER.desc);
		
        //開始頁
        query.setStart(0);
        //一頁顯示多少條
        query.setRows(50);
        
		//開啟高亮
		//query.setHighlight(true);
		//設置高亮字段
		//query.addHighlightField("demoName");
		//前綴
		//query.setHighlightSimplePre("<font color='red'>");
		//后綴
		//query.setHighlightSimplePost("</font>");
		//執(zhí)行查找
		QueryResponse response = testSolrClient.query(query);
		
		SolrDocumentList results = response.getResults();
		//獲取查詢到的數據總量
		long numFound = results.getNumFound();
		if(numFound <= 0) {
			//如果小于0,表示未查詢到任何數據,返回null
			return null;
		}else {
		
			List<SolrDemo> list = new ArrayList<SolrDemo>();
			//遍歷結果集
			for (SolrDocument doc : results) {
				//得到每條數據的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層,就是直接寫幾個請求然后調用一下service即可,代碼及后續(xù)測試結果就不貼出來了,請自行編寫。

備注

1.solr文件說明

文件夾描述
contribsolr的一些插件,用于擴展solr的功能
dist該文件夾下包含build過程中產生的war和jar文件,以及相關的依賴文件
docsolr的文檔
examplesolr官方提供的一些示例程序,簡單介紹下面三個目錄solr、multicore、webapps
solr該目錄是一個包含了默認配置信息的Solr的Core目錄
multicore該目錄包含了在Solr的multicore中設置的多個Core目錄
webapps該目錄中包括一個solr.war,該war可作為solr的運行實例工程

2.清除索引文件 <delete><query>*:*</query></delete><commit/> springboot 中怎么整合solr

3.solrHome是solr運行的主目錄,其下可以創(chuàng)建多個solrCore,solrCore單獨對外提供一個搜索服務。

4.solr.install.dir表示solrCore的位置,需要根據實際jar包的位置更改jar包引用路徑

5.solr.data.dir表示索引文件存儲地址 默認solrCore/data,一開始沒有,會自動創(chuàng)建,若要修改,找solrconfig.xml文件 <dataDir>${solr.data.dir:}</dataDir>

5.ik分詞器的集成(關于忽略詞,近義詞等等詳細配置后續(xù)添加)

看完上述內容,你們掌握springboot 中怎么整合solr 的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

名稱欄目:springboot中怎么整合solr
網站鏈接:http://bm7419.com/article28/igcocp.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供營銷型網站建設、用戶體驗、動態(tài)網站、App設計軟件開發(fā)、微信公眾號

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網站優(yōu)化