springboot 集成solr

1、版本介紹:

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

2、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代替此全路徑)java

  • 2.在solrhome下新建logs文件夾(記下此路徑:D:\JAVA\solr\solrhome\logs)mysql

  • 3.複製文件夾solr-7.4.0\contrib和solr-7.4.0\dist至solrhome下 web

  • 4.複製solr-7.4.0\server\solr下全部文件至solrhome下 spring

  • 5.在solrhome下新建new_core文件夾,sql

  • 6.將solr-7.4.0\server\solr\configsets_default\conf文件夾複製到new_core下數據庫

  • 7.修改solrhome\new_core\conf\solrconfig.xml文件:
    apache

貼出具體代碼以下:tomcat

<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下,見後續操做 -->
    <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

若是配置了ik分詞器能夠按此修改: <field name="demoName" type="text_ik" indexed="true" stored="true"/>springboot


配置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項目裏找,找到後也複製到該目錄下)

修改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地址即上述建立的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" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

修改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>

3、solr體驗

啓動tomcat,訪問 http://localhost:8888/solr/index.html#/

用ik解析中文語句,匹配測試以下

導入數據庫demo表的數據

檢索測試


3、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執行下述查詢會報錯,
	 * 無奈只能這麼玩了,若網友有好的解決方法,請在下方留言
	 * 或是調用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>");
		//執行查找
		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便可,代碼及後續測試結果就不貼出來了,請自行編寫。

備註

1.solr文件說明

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

2.清除索引文件 <delete><query>*:*</query></delete><commit/>

3.solrHome是solr運行的主目錄,其下能夠建立多個solrCore,solrCore單獨對外提供一個搜索服務。

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

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

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

相關文章
相關標籤/搜索