1. 程式人生 > >solr7安裝以及整合ik分詞器

solr7安裝以及整合ik分詞器

今天來研究了一下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 操作solr
package 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分詞器,效果如下