jdk1.8
tomcat8
springboot 2.1.3RELEASE(這裏有坑,詳見下文)
solr 7.4.0 (沒有選擇最新的版本,是由於項目的boot版本是2.1.3,其對應的solr-solrj.jar版本是7.4.0,爲避免出現不可預料不可抗拒不可解決的問題,謹慎選用與之同樣版本)html
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>
<?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&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>
若是配置了ik分詞器能夠按此修改: <field name="demoName" type="text_ik" indexed="true" stored="true"/>
springboot
修改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分詞器解壓出來的兩個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>
啓動tomcat,訪問 http://localhost:8888/solr/index.html#/
用ik解析中文語句,匹配測試以下
導入數據庫demo表的數據
檢索測試
<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,按照下述操做步驟走完,啓動項目會報錯,
提示: 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 #當遇到一樣名字的時候,是否容許覆蓋註冊
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分詞器的集成(關於忽略詞,近義詞等等詳細配置後續添加)