目錄
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");*/
}
}