Solr6.6的安裝以及Java使用SolrJ呼叫Solr服務,springmvc使用solr,springboot使用solr
阿新 • • 發佈:2019-02-17
一,Solr環境安裝
1、安裝Jdk1.8(solr6.6是 1.8編譯的) / Tomcat8 / Solr6.6 各軟體
2、 下載 : 下載 solr 6.6 版本:http://www.apache.org/dyn/closer.lua/lucene/solr/6.6.0
3、將 solr 壓縮包中 solr 6.6 下的server\solr-webapp\資料夾下有個webapp資料夾,將之複製到Tomcat\webapps\目錄下,並改成solr (名字隨意,通過瀏覽器進行訪問solr管理介面時要用到)
4、將 solr 壓縮包中 solr 6.6\server\lib\ext 中的 jar 全部複製到 Tomcat\ webapps\solr\WEB-INF\lib 目錄中, solr 6.6\server\lib\中以metrics開頭的jar複製到 Tomcat\ webapps\solr\WEB-INF\lib 中
5、將 solr 壓縮包中 solr 6.6/ server/resources /log4j.properties 複製到Tomcat\ webapps\solr\WEB-INF\lib 目錄中
7、開啟Tomcat/webapps/solr/WEB-INF下的web.xml,找到如下配置內容(初始狀態下該內容是被註釋掉的):
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-value>/put/your/solr/home/here</env-entry-value>
<env-entry-type>Java.lang.String</env-entry-type>
</env-entry>
將<env-entry-value>中的內容改成你的solr_home路徑,這裡是D:/solr_home
測試結果:
1、安裝Jdk1.8(solr6.6是 1.8編譯的) / Tomcat8 / Solr6.6 各軟體
2、 下載 : 下載 solr 6.6 版本:http://www.apache.org/dyn/closer.lua/lucene/solr/6.6.0
3、將 solr 壓縮包中 solr 6.6 下的server\solr-webapp\資料夾下有個webapp資料夾,將之複製到Tomcat\webapps\目錄下,並改成solr (名字隨意,通過瀏覽器進行訪問solr管理介面時要用到)
4、將 solr 壓縮包中 solr 6.6\server\lib\ext 中的 jar 全部複製到 Tomcat\ webapps\solr\WEB-INF\lib 目錄中, solr 6.6\server\lib\中以metrics開頭的jar複製到 Tomcat\ webapps\solr\WEB-INF\lib 中
5、將 solr 壓縮包中 solr 6.6/ server/resources /log4j.properties 複製到Tomcat\ webapps\solr\WEB-INF\lib 目錄中
6、將 solr 壓縮包中 solr 6.6/server/solr/ 目錄下的solr.xml,zoo.cfg,README.txt複製到計算機某個目錄下,如D:\solr_home
在solr_home目錄下新建一個檔案建solr_core,
將 solr 壓縮包中 solr 6.6/server/solr/ configsets/basic_configs目錄下conf目錄複製到複製到上一步新建的檔案solr_core內 即:D:\solr_home\solr_core
7、開啟Tomcat/webapps/solr/WEB-INF下的web.xml,找到如下配置內容(初始狀態下該內容是被註釋掉的):
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-value>/put/your/solr/home/here</env-entry-value>
<env-entry-type>Java.lang.String</env-entry-type>
</env-entry>
將<env-entry-value>中的內容改成你的solr_home路徑,這裡是D:/solr_home
註釋許可權控制
<!-- <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> -->
8、儲存關閉,而後啟動tomcat,我這裡改的是8081的埠,所以在瀏覽器輸入http://localhost:8081/solr即可出現Solr的管理介面如下:
9選中CoreAdmin來建立一個core用來儲存資料
建立成功後會在solrhome/solr_core下生產data資料夾,以及core.properties檔案
通過程式呼叫的時候可以通過url :http://ip:port/solr/solr_core來使用solr服務,solr可以建立多個core,步驟5,6重複即可
二,JAVA使用SolrJ呼叫Solr服務
pom中引入
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>6.6.0</version>
</dependency>
執行java程式碼出現unknow filed ’name’ exception時,在solr_home目錄中的conf內的配置檔案managed-schema加上 field配置
<field name="name" type="string" indexed="true" stored="true"/>
<field name="description" type="string" indexed="true" stored="true"/>
JAVA程式碼:
package org.springframework.data.solr.showcase;
import org.apache.solr.client.solrj.beans.Field;
public class Person {
@Field
private String id;
@Field
private String name;
@Field
private String description;
public Person() {
}
public Person(String id, String name, String description) {
this.id = id;
this.name = name;
this.description = description;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", description="
+ description + "]";
}
}
package org.springframework.data.solr.showcase;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
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.apache.solr.common.SolrInputDocument;
import org.apache.solr.common.params.FacetParams;
public class SolrTest {
//指定solr伺服器的地址
private final static String SOLR_URL = "http://localhost:8081/solr/";
private String solrCore="solr_core";//指定的儲存資料的collection
/**
* 建立SolrServer物件
*
* 該物件有兩個可以使用,都是執行緒安全的
* 1、CommonsHttpSolrServer:啟動web伺服器使用的,通過http請求的
* 2、 EmbeddedSolrServer:內嵌式的,匯入solr的jar包就可以使用了
* 3、solr 4.0之後好像添加了不少東西,其中CommonsHttpSolrServer這個類改名為HttpSolrClient
*
* @return
*/
public HttpSolrClient createSolrServer(){
HttpSolrClient solr = null;
solr = new HttpSolrClient(SOLR_URL);
solr.setConnectionTimeout(100);
solr.setDefaultMaxConnectionsPerHost(100);
solr.setMaxTotalConnections(100);
return solr;
}
public void addPersonBatch() throws IOException, SolrServerException{
List<Person> list = new ArrayList<Person>();
list.add(new Person("1","zhangsanfeng","我是張三丰"));
list.add(new Person("2","zhangsanfeng123","我是張三丰123"));
list.add(new Person("3","zhangsan123","我是張三"));
list.add(new Person("4","zhangsan123456","我是張三"));
list.add(new Person("5","lisi","李四"));
list.add(new Person("6","lisi5","我是lisi"));
list.add(new Person("7","wangwu","王五"));
list.add(new Person("8","wangwu","王五002"));
HttpSolrClient solr = new HttpSolrClient(SOLR_URL + solrCore);
solr.addBeans(list);
solr.commit();
solr.close();
}
public void addPersonIndex() throws IOException, SolrServerException{
Person p = new Person();
p.setId("9");
p.setName("zhangsan");
p.setDescription("張三");
HttpSolrClient solr = new HttpSolrClient(SOLR_URL + solrCore);
solr.addBean(p);
solr.commit();
solr.close();
}
/**
* 往索引庫新增文件
* @throws IOException
* @throws SolrServerException
*/
public void addDoc() throws SolrServerException, IOException{
//構造一篇文件
SolrInputDocument document = new SolrInputDocument();
//往doc中新增欄位,在客戶端這邊新增的欄位必須在服務端中有過定義
document.addField("id", "10");
document.addField("name", "JAVA大神");
document.addField("description", "世界上最牛逼的JAVA大神");
//獲得一個solr服務端的請求,去提交 ,選擇具體的某一個solr core
HttpSolrClient solr = new HttpSolrClient(SOLR_URL + solrCore);
solr.add(document);
solr.commit();
solr.close();
}
/**
* 根據id從索引庫刪除文件
*/
public void deleteDocumentById() throws Exception {
//選擇具體的某一個solr core
HttpSolrClient server = new HttpSolrClient(SOLR_URL+solrCore);
//刪除文件
// server.deleteById("8");
//刪除所有的索引
server.deleteByQuery("*:*");
//提交修改
server.commit();
server.close();
}
/**
* 查詢
* @throws Exception
*/
public void querySolr() throws Exception{
HttpSolrClient solrServer = new HttpSolrClient(SOLR_URL+solrCore);
SolrQuery query = new SolrQuery();
//下面設定solr查詢引數
// query.set("q", "*:*");// 引數q 查詢所有
// query.set("q","*zhangsan*");//相關查詢,比如某條資料某個欄位含有周、星、馳三個字 將會查詢出來 ,這個作用適用於聯想查詢
//引數fq, 給query增加過濾查詢條件
// query.addFilterQuery("id:[0 TO 9]");//id為0-9
//給query增加布爾過濾條件
//query.addFilterQuery("description:演員"); //description欄位中含有“演員”兩字的資料
//引數df,給query設定預設搜尋域
// query.set("df", "name");
query.setQuery("name:*");
// query.setQuery("name:*zhangsan* OR name:*123*" );//name 包含zhangsan或者123
// query.setQuery("name:*zhangsan* AND description:*zhangsan*" );// name包含且
//分組查詢
query.setFacet(true);
query.addFacetField("name","description");//兩個域有各自獨立的結果
/*
* FacetComponet有兩種排序選擇,分別是count和index,
* count是按每個詞出現的次數,index是按詞的字典順序。如果查詢引數不指定facet.sort,solr預設是按count排序。
*/
query.setFacetSort(FacetParams.FACET_SORT_COUNT);
/*query.setFacetLimit(101); */ // 設定返回結果條數 ,-1表示返回所有,預設值為100
/* query.setParam(FacetParams.FACET_OFFSET, "100");*/ //開始條數,偏移量,它與facet.limit配合使用可以達到分頁的效果
query.setFacetMinCount(1);//設定 限制 count的最小返回值,預設為0
query.setFacetMissing(false);//不統計null的值
/* query.setFacetPrefix("test");//設定字首 */
//引數sort,設定返回結果的排序規則
// query.addSort("id",SolrQuery.ORDER.asc);
// query.addSort("name", SolrQuery.ORDER.desc);
//設定分頁引數
// query.setStart(0);
// query.setRows(10);//每一頁多少值
//引數hl,設定高亮
query.setHighlight(true);
//設定高亮的欄位
query.addHighlightField("name");
//設定高亮的樣式
query.setHighlightSimplePre("<font color='red'>");
query.setHighlightSimplePost("</font>");
//獲取查詢結果
QueryResponse response = solrServer.query(query);
//兩種結果獲取:得到文件集合或者實體物件
// 獲取高亮資料結果
//Map<String, Map<String, List<String>>> map = response.getHighlighting();
// 得到FacetField結果
System.out.println(response.getFacetFields());
//獲取高亮資料結果
System.out.println("高亮資料結果"+response.getHighlighting());
//查詢得到文件的集合
SolrDocumentList solrDocumentList = response.getResults();
System.out.println("通過文件集合獲取查詢文件數量:"+solrDocumentList.getNumFound());
//遍歷列表
for (SolrDocument doc : solrDocumentList) {
System.out.println("id:"+doc.get("id")+" name:"+doc.get("name")+" description:"+doc.get("description"));
}
//得到實體物件
List<Person> tmpLists = response.getBeans(Person.class);
if(tmpLists!=null && tmpLists.size()>0){
System.out.println("實體物件賦值內容:");
for(Person per:tmpLists){
System.out.println(per.toString());
}
}
}
public static void main(String[] args) throws Exception {
SolrTest solr = new SolrTest();
//solr.createSolrServer();
solr.addDoc();
solr.addPersonIndex();
solr.addPersonBatch();
// solr.deleteDocumentById();
solr.querySolr();
}
}
測試結果:
分組結果:[name:[wangwu (2), JAVA大神 (1), lisi (1), lisi5 (1), zhangsan (1), zhangsan123 (1), zhangsan123456 (1), zhangsanfeng (1), zhangsanfeng123 (1)], description:[我是張三 (2), 世界上最牛逼的JAVA大神 (1), 張三 (1), 我是lisi (1), 我是張三丰 (1), 我是張三丰123 (1), 李四 (1), 王五 (1), 王五002 (1)]]
高亮資料結果:{3={name=[<font color='red'>zhangsan123</font>]}, 2={name=[<font color='red'>zhangsanfeng123</font>]}, 1={name=[<font color='red'>zhangsanfeng</font>]}, 10={name=[<font color='red'>JAVA大神</font>]}, 7={name=[<font color='red'>wangwu</font>]}, 6={name=[<font color='red'>lisi5</font>]}, 5={name=[<font color='red'>lisi</font>]}, 4={name=[<font color='red'>zhangsan123456</font>]}, 9={name=[<font color='red'>zhangsan</font>]}, 8={name=[<font color='red'>wangwu</font>]}}
通過文件集合獲取查詢文件數量:10
id:10 name:JAVA大神 description:世界上最牛逼的JAVA大神
id:9 name:zhangsan description:張三
id:1 name:zhangsanfeng description:我是張三丰
id:2 name:zhangsanfeng123 description:我是張三丰123
id:3 name:zhangsan123 description:我是張三
id:4 name:zhangsan123456 description:我是張三
id:5 name:lisi description:李四
id:6 name:lisi5 description:我是lisi
id:7 name:wangwu description:王五
id:8 name:wangwu description:王五002
實體物件賦值內容:
Person [id=10, name=JAVA大神, description=世界上最牛逼的JAVA大神]
Person [id=9, name=zhangsan, description=張三]
Person [id=1, name=zhangsanfeng, description=我是張三丰]
Person [id=2, name=zhangsanfeng123, description=我是張三丰123]
Person [id=3, name=zhangsan123, description=我是張三]
Person [id=4, name=zhangsan123456, description=我是張三]
Person [id=5, name=lisi, description=李四]
Person [id=6, name=lisi5, description=我是lisi]
Person [id=7, name=wangwu, description=王五]
Person [id=8, name=wangwu, description=王五002]
springboot配置:https://git.oschina.net/kerry_li/spring-data-solr-showcase
springmvc 配置:https://git.oschina.net/kerry_li/spring-solr-test