solr7.5的使用教程

目錄

1.下載

2.啓動

3.tomcat呢?

4.漢語分詞器

5.java使用


1.下載

https://lucene.apache.org/solr/mirrors-solr-latest-redir.html點擊這裏下載

下載完目錄結構大約是這樣

2.啓動

怎麼啓動?

啓動有兩種方式,solr從5.0開始裏面就內嵌了jetty的嵌入式服務器啓動。當然你也可以放到tomcat裏去啓動。

進入bin文件夾裏,然後右鍵在此處打開命令行。

這就啓動了,默認端口是8983.我們打開localhost:8983

 

可以看到已經啓動成功了.到了solr的後臺管理界面了.

有頁面有服務,那麼它實際上jetty啓動的項目是在這裏solr-7.5.0\server\solr-webapp\webapp

這裏面有個要注意的地方.

就是兩個概念.也就是

solr_home和solr_core.

solr_home相當於tomcat的webapp.

solr_core相當於裏面的一個項目.

無論是tomcat啓動solr,還是jetty啓動solr,都相當於啓動加載了一個solr_home.至於裏面有沒有solr_core,有幾個solr_core,那這要看你準備部署幾個搜索項目.

那麼jetty啓動的時候默認的solr_home是在這裏solr-7.5.0\server\solr

它默認是這樣的

這裏面這六個文件,只有solr.xml纔是solr_home所必須的。將來你可以換個文件夾作爲solr_home,其他的可能不需要,但是請把這個solr.xml給複製到裏面。它是必須的。

其他的東西實際上是沒什麼卵用的。

 接下來我們在localhost:8983裏創建下solr_core。

點擊Add Core的意思是我要創建一個叫做new_core的solr_core。要注意的是第二行,意思是該核心solr_core所處的文件夾是%solr_home%/new_core 。但實際上我們那個目錄裏面是沒有這個文件夾的。所以直接點擊確定肯定會報錯。

我們需要新建個new_core的文件夾。

solr_home的必須文件是solr.xml

solr_core也有必須品,那就是配置。

在solr-7.5.0\server\solr\configsets\_default裏。我們直接把裏面的conf文件夾複製到新建的new_core裏面。

然後在網站上點擊添加,這樣就添加了。

然後到這裏:

 

3.tomcat呢?

用tomcat來啓動怎麼啓動?

1.在tomcat下新建個項目,直接把\solr-7.5.0\server\solr-webapp\webapp這裏面的東西複製進去。

2.但還要注意:需要把solr-7.5.0\server\lib下面的以metrics開頭的jar包,和solr-7.5.0\server\lib\ext下面的所有jar包放到項目裏面。

3.修改web.xml,把這段給註釋了.

 <!-- Get rid of error message 
  <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>-->

添加環境變量指向solr_home.你可以隨便新建個文件夾把solr.xml給複製過來,就當是solr_home了

  <env-entry>
    <env-entry-name>solr/home</env-entry-name>
    <env-entry-type>java.lang.String</env-entry-type>
    <env-entry-value>C:\\Users\\Administrator\\Desktop\\solrHome</env-entry-value>
  </env-entry>

這樣才能啓動成功。

4.漢語分詞器

什麼是搜索?

比如:“我喜歡唐老鴨”這句話存起來,爲什麼可以搜"唐老鴨"三個字就可以搜到“我喜歡唐老鴨”這句話?

搜索把句子拆成關鍵詞語然後做成索引,則可以根據索引搜索到。

那麼拆句怎麼拆?這就需要分詞器了.

然而我們處在中國,需要配置上漢語的分詞器。

漢語的分詞器叫做:IKAnalyzer

下載下來,解壓後目錄大約是這樣的:

如果你要配置漢語的分詞器,則需要做到下面三件事情:

1.把裏面倆jar包,放到項目WEB-INF/lib裏.

2.把剩下三個文件放到項目WEB-INF/classes下面(如果沒有classes文件夾,新建即可)

3.添加分詞器到核心配置文件裏.配置文件是哪個?是這個

隨便在裏面找個地方添加以下內容:

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

這個文件裏面的一些屬性是什麼意思?請參考我的另外一篇博客:點擊這裏,你最好先看完這個

那麼現在漢語分詞器就安裝好了.可以重新啓動起來. 

5.java使用

我們假設一個需求:

現在把商品存到搜索服務器裏.

商品goods有幾個屬性:

goodsid ID
goodstitle 商品標題
goodspics 商品圖片
createTime 創建時間

搜索包含關鍵字的商品標題的所在商品.且是按創建時間倒查.

首先需要在managed-schema配置以下幾個屬性

    <field name="goodsid" type="string"  stored="true" required="true" multiValued="false" /> 
	<field name="goodstitle" type="text_ik" indexed="true" required="true" stored="true" multiValued="false"/>
	<field name="goodspics" type="string"  stored="true" required="true" multiValued="false"/>
	<field name="createTime" type="plong"  stored="true" required="true" multiValued="false"/>

記得這個配置文件默認的是"id".找到下面這個標籤,替換成goodsid

<uniqueKey>goodsid</uniqueKey>

 

 然後在項目裏面maven引入文件

<dependency>
	    <groupId>org.apache.solr</groupId>
	    <artifactId>solr-solrj</artifactId>
	    <version>7.5.0</version>
	</dependency>

接下來我直接粘貼一個工具類吧.裏面都有註釋.

package com.bai.solrs;

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.client.solrj.response.UpdateResponse;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
/*
 * 
	<field name="goodsid" type="string"  stored="true" required="true" multiValued="false" /> 
	<field name="goodstitle" type="text_ik" indexed="true" stored="true" multiValued="false"/>
	<field name="goodspics" type="string"  stored="true" multiValued="false"/>
	<field name="createTime" type="plong"  stored="true" multiValued="false"/>
	
	<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>
 	
 	 <!--記得這個id覆蓋掉-->
 	 <!--<uniqueKey>goodsid</uniqueKey>-->
 */
/**
 * 模擬商品數據的存取。
 * 商品有四個屬性。分別是goodsid 主鍵id,goodstitle 商品標題,goodspics 商品圖片,createTime 創建時間
 * @author dmw
 *
 * 2018年11月6日
 */
public class SolrUtil  {
	/**
	 * solr7+的客戶端連接器
	 */
	private static HttpSolrClient client;
	/**
	 * solr服務端核心的url
	 */
	private static String baseUrl = "http://localhost:8080/solr/new_core";
	/**
	 * 是否數據批量刷入Solr.
	 * 如果爲false,代表着單個刷入,即每新增一個數據便立即刷入
	 * 如果爲true,代表着先把數據放入集合裏,直到集合的長度爲max_pool_size時,再統一批量刷入solr
	 */
	private static boolean collectCommite = false;
	/**
	 * 集合的最大長度
	 */
	private static int max_pool_size = 10;
	/**
	 * 數據集合
	 */
	private static List<SolrInputDocument> pool = new ArrayList<SolrInputDocument>();
	
	
	
	static{
		client = new HttpSolrClient.Builder(baseUrl)
				.withConnectionTimeout(3000)
				.withSocketTimeout(5000)
				.build();
	}
	
	
	/**
	 * 添加
	 * 
	 * @param goodsid
	 * @param goodstitle
	 * @param goodspics
	 * @throws SolrServerException
	 * @throws IOException
	 */
	public static void add(String goodsid,String goodstitle,String goodspics) throws SolrServerException, IOException{
		/**
		 * 創建一個元素,添加四個屬性
		 */
		SolrInputDocument document = new SolrInputDocument();
		document.addField("goodsid", goodsid);
		document.addField("goodstitle", goodstitle);
		document.addField("goodspics", goodspics);
		document.addField("createTime", System.currentTimeMillis());
		
		if (collectCommite){
			/**
			 * 放入池子裏.如果池子長度等於或超出設定長度,批量刷入
			 */
			synchronized ("ok") {
				pool.add(document);
				if (pool.size() >= max_pool_size){
					client.add(pool);
					client.commit();
					pool.clear();
				}
				
			}
		}else {
			/**
			 * 來一個刷一個
			 */
			client.add(document);
			client.commit();
		}
		
	}
	/**
	 * 搜索
	 * 
	 * @param title
	 * @param page
	 * @param rows
	 * @return
	 * @throws SolrServerException
	 * @throws IOException
	 */
	public static SolrDocumentList get(String keyword,int page,int rows) throws SolrServerException, IOException{
		/**
		 * 本例條件是:
		 * 1.商品標題帶有某個關鍵字的
		 * 2.分頁查詢 page是頁,rows是每頁幾個
		 * 3.按創建時間倒查
		 */
		SolrQuery query = new SolrQuery("goodstitle:"+keyword);
		query.setStart((page-1)*rows);
		query.setRows(rows);
		query.setSort("createTime", SolrQuery.ORDER.desc);
		QueryResponse response = client.query(query);
		SolrDocumentList results = response.getResults();
		return results;
	}
	/**
	 * 刪除
	 * @param goodsid
	 * @throws SolrServerException
	 * @throws IOException
	 */
	public static void delete(String goodsid) throws SolrServerException, IOException{
		client.deleteById(goodsid);
		client.commit();
	}
	
	public static void main(String[] args) throws SolrServerException, IOException {
		/**
		 * 搜索的測試
		SolrDocumentList list = get("米老",1,10);
		System.out.println(JSONArray.fromObject(list).toString());*/
		
		
		
		/*
		 * 添加的測試*/
		
		/* add(UUID.randomUUID().toString(), "我喜歡米老鼠", "1.jpg");*/
		/*add(UUID.randomUUID().toString(), "黑皮西瓜", "1.jpg");
		add(UUID.randomUUID().toString(), "南方大西瓜", "1.jpg");*/
		
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章