solr7安裝以及整合ik分詞器
阿新 • • 發佈:2019-01-06
今天來研究了一下solr,以及怎麼整合ik分詞器,把研究的過程記錄下來,整個過程是在windows 7系統中完成的。
1、solr7環境要求
solr7.2.1需要java8環境,且需要在環境變數中新增 JAVA_HOME變數,指向jdk1.8的目錄,如下圖:
2、下載solr並啟動
把下載的solr解壓到出來,並通過cmd視窗進入到solr-7.2.1\bin目錄,在位址列中輸入cmd,開啟命令視窗
輸入以下命令執行solr
solr.cmd start
2、開啟控制檯
在瀏覽器中輸入http://localhost:8983,如果能開啟solr控制檯介面,說明solr啟動成功。
3、建立一個core
我們建立一個articles的集合,輸入如下命令:
solr.cmd create -c articles
之後就可以在控制檯中看到建立的articles了
4、配置ik分詞
1、把下載的ik分詞器解壓出來,並把下面兩個jar包複製到:solr-7.2.1\server\solr-webapp\webapp\WEB-INF\lib裡
2、在solr-7.2.1\server\solr-webapp\webapp\WEB-INF目錄下新建一個classes目錄,把下面三個檔案複製進去
3、進入solr-7.2.1\server\solr\articles\conf目錄,用記事本或其他文字編輯器開啟managed-schema檔案,在截圖中的位置新增如下程式碼:
<fieldType name="text_ik" class="solr.TextField"> <analyzer type="index" useSmart="false" class="org.wltea.analyzer.lucene.IKAnalyzer" /> <analyzer type="query" useSmart="true" class="org.wltea.analyzer.lucene.IKAnalyzer" /> </fieldType>
4、重新啟動solr
關閉:solr.cmd stop -all
啟動:solr.cmd start
在控制檯中選中articles,並開啟Analysis選單,輸入截圖中的文字,點選按鈕,發現可以分詞成功,說明ik分詞器安裝成功。
5、java操作solr
1、在managed-schema檔案中追加以下內容,field 中的name欄位要跟java實體對應
<field name="id" type="string" multiValued="false" indexed="true" required="true" stored="true"/>
<field name="labels" type="text_ik" indexed="true" stored="true"/>
<field name="title" type="string" indexed="true" stored="true"/>
2、pom檔案新增如下依賴
<dependencies>
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>5.5.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.7</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.3.2</version>
</dependency>
<!-- Jackson Json處理工具包 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.4.2</version>
</dependency>
</dependencies>
3、新增SolrDataDTO.java檔案
package solrtest01;
import java.io.Serializable;
import org.apache.solr.client.solrj.beans.Field;
public class SolrDataDTO implements Serializable {
private static final long serialVersionUID = 1L;
@Field("id")
private Integer id;
@Field("title")
private String title;
@Field("labels")
private String labels;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getLabels() {
return labels;
}
public void setLabels(String labels) {
this.labels = labels;
}
}
4、新增SolrUtils 操作solrpackage solrtest01;
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.impl.HttpSolrServer;
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;
public class SolrUtils {
private String serverUrl = "http://localhost:8983/solr/articles";
public void Add(SolrDataDTO dto) throws IOException, SolrServerException{
HttpSolrClient client=new HttpSolrClient(serverUrl);
SolrInputDocument document=new SolrInputDocument();
client.addBean(dto);
client.commit();
}
public List<SolrDataDTO> search(String keywords,Integer page, Integer rows ) throws SolrServerException, IOException{
HttpSolrClient client=new HttpSolrClient(serverUrl);
SolrQuery solrQuery = new SolrQuery(); //構造搜尋條件
solrQuery.set("q","title:" + keywords); //搜尋關鍵詞
// 設定分頁 start=0就是從0開始,,rows=5當前返回5條記錄,第二頁就是變化start這個值為5就可以了。
solrQuery.setStart((Math.max(page, 1) - 1) * rows);
solrQuery.setRows(rows);
//執行搜尋
QueryResponse queryResponse = client.query(solrQuery);
//搜尋結果
SolrDocumentList results = queryResponse.getResults();
//總數量
long numFound = results.getNumFound();
List<SolrDataDTO> dataDTOs=new ArrayList<SolrDataDTO>();
for (SolrDocument solrDocument : results) {
SolrDataDTO dto=new SolrDataDTO();
dto.setId(Integer.valueOf(solrDocument.get("id").toString()));
dto.setLabels(solrDocument.get("labels").toString());
dto.setTitle(solrDocument.get("title").toString());
dataDTOs.add(dto);
}
//List<SolrDataDTO> dataDTOs=queryResponse.getBeans(SolrDataDTO.class);
System.out.println("查詢出來的總量為:"+numFound);
return dataDTOs;
}
public void del() throws SolrServerException, IOException
{
HttpSolrClient client=new HttpSolrClient(serverUrl);
List<String>ids=new ArrayList<String>();
ids.add("1");
ids.add("2");
ids.add("3");
ids.add("4");
ids.add("5");
client.deleteById(ids);
client.commit();
}
}
5、solr新增資料
SolrUtils solrUtils=new SolrUtils();
@Test
public void add() throws IOException, SolrServerException
{
SolrDataDTO dto=new SolrDataDTO();
dto.setId(4);
dto.setTitle("標題4");
dto.setLabels("動物,羊,馬");
solrUtils.Add(dto);
dto.setId(5);
dto.setTitle("標題5");
dto.setLabels("公交,地鐵,飛機");
solrUtils.Add(dto);
}
6、開啟solr控制檯檢視資料,發現數據寫入成功
7、我們在labels欄位上使用了ik分詞器,效果如下