v1.下載solr
v2.目錄結構如下
v3.啟動solr(默認使用jetty部署)
在path路徑下將 bin文件夾對應的目錄加入,然后輸入 solr start(或者 solr start -p port,指定端口啟動)。在瀏覽器中訪問如下:
當然,還可以啟動其他樣例的服務,在example目錄下有一個READEME.txt,如果感興趣請看一下。命令格式如下:
Solr example------------This directory contains Solr examples. Each example is contained in a
separate directory. To run a specific example,do:
bin/solr -e where is one of:
cloud : SolrCloud example
dih : Data Import Handler (rdbms, mail, rss, tika)
schemaless : Schema-less example (schema is inferred from data during indexing)
techproducts : Kitchen sink example providing comprehensive examples of Solr features
v4.Individual SolrCore
在server/solr目錄下,有一個README.txt的文件,其中說明了如何建立solr core。最簡單的建立是直接復制solr中為我們提供好的例子,打開server/solr/configsets目錄會發現里面已經有三個例子,因為我們是要從數據庫導入數據,所以復制 “data_driven_schema_configs” 這個例子並改名為 “myCollections”。
v5.導入需要的jar包
為了導入數據和鏈接mysql,我們還需要導入兩個重要的jar包。由於mysql的jar包並沒有在項目中,我是復制了一份放到了dist目錄下面了。另外兩個需要的jar包就是dist目錄下帶有“dataimport”標識的jar包。
然后打開myCollections/conf/solrconfig.xml,引用上面提到的jar包,如下。
v6.建立數據庫
建立好之后,隨便寫入一點兒數據。
v7.添加requestHandler
繼續修改myCollections/conf/solrconfig.xml,搜索 ,然后在該行之上添加如下代碼。
data-config.xml
v8.建立連接配置文件
在myCollections/conf目錄下新建data-config.xml, 內容如下。
<?xml version="1.0" encoding="UTF-8"?>
'${dataimporter.last_index_time}'">
說明:
dataSource是數據庫數據源。Entity就是一張表對應的實體,pk是主鍵,query是查詢語句。Field對應一個字段,column是數據庫里的column名,后面的name屬性對應着Solr的Filed的名字。其中solrdata是數據庫名,goods是表名。
其中deltaQuery是增量索引,原理是從數據庫中根據deltaQuery指定的SQL語句查詢出所有需要增量導入的數據的ID號。然后根據deltaImportQuery指定的SQL語句返回所有這些ID的數據,即為這次增量導入所要處理的數據。核心思想是:通過內置變量“${dih.delta.id}”和 “${dataimporter.last_index_time}”來記錄本次要索引的id和最近一次索引的時間。
v9.managed-schema配置field信息
搜索
注意:默認的 filed 不要刪除哦!
v10.添加我們剛剛建立的core
(1).點擊Core Admin,配置我們建立的solr Core的信息,如下所示。
(2).點擊 Add Core,如下所示。
(3).測試索引是否成功
索引成功
(4).監測查詢成功
查詢成功
v11.通過代碼調用solr服務
簡單建立一個java項目,依賴上dist目錄下的solr-solrj-6.0.0.jar。
測試代碼如下。
importjava.lang.reflect.Method;importjava.sql.Timestamp;importorg.apache.solr.client.solrj.SolrQuery;importorg.apache.solr.client.solrj.impl.HttpSolrServer;importorg.apache.solr.client.solrj.response.QueryResponse;importorg.apache.solr.common.SolrInputDocument;importcom.entity.Good;
@SuppressWarnings("deprecation")public classSolr {private staticHttpSolrServer solrServer;static{//注意請求地址格式:瀏覽器中的地址有 ‘#’,需要把‘#’去掉!
solrServer = new HttpSolrServer("http://localhost:8983/solr/hjz");
solrServer.setConnectionTimeout(5000);
}/*** 添加單個文檔 。
*
*@paramarticle 文章對象
*@paramarticleAddon 文章正文對象*/
public static voidinsert(Good good) {
SolrInputDocument doc= newSolrInputDocument();
doc.addField("id", good.getId());
doc.addField("name", good.getName());
doc.addField("number", good.getNumber());
doc.addField("updateTime", good.getUpdateTime());try{
solrServer.add(doc);
solrServer.commit();
}catch(Exception e) {
e.printStackTrace();
}
}/*** 根據文檔id刪除文檔 。*/
public static voiddeleteById(String id) {try{
solrServer.deleteById(id+"");
solrServer.commit();
}catch(Exception e) {
e.printStackTrace();
}
}/*** 刪除所有文檔,為安全起見,使用時再解注函數體 。*/
public static voiddeleteAll() {try{
solrServer.deleteByQuery("*:*");
solrServer.commit();
}catch(Exception e) {
e.printStackTrace();
}
}/*** 更新文檔,其實也是通過insert操作來完成 。
*
*@paramarticle 文章對象
*@paramarticleAddon 文章內容對象,如果不更新正文,可以為null。*/
public static voidupdate(Good good) {
insert(good);
}/*** 根據文檔id查詢單個文檔 。
*@return
*/
public static T getById(int id, Classclazz) {
SolrQuery query= newSolrQuery();
query.setQuery("id:" +id);try{
QueryResponse rsp=solrServer.query(query);return rsp.getBeans(clazz).get(0);
}catch(Exception e) {
e.printStackTrace();
}return null;
}/***@paramobj 對象索引
*@paramidName 主鍵名稱*/
public static voiddeleteByObject(Object obj, String idName){try{
Class> clazz =obj.getClass();//將idName的首字母變成大寫
if(Character.isLowerCase(idName.charAt(0))) idName = Character.toUpperCase(idName.charAt(0)) + idName.substring(1);
Method method= clazz.getMethod("get"+idName);
String idValue=(String) method.invoke(obj);
deleteById(idValue);
}catch(Exception e) {
e.printStackTrace();
}
}public static voidmain(String[] args){
Good good= new Good("123", 9999, "hjzgg5211314", newTimestamp(System.currentTimeMillis()));//Solr.update(good);//System.out.println(Solr.getById(123, Good.class));
deleteByObject(good, "id");
}
}
對應的實體類。
importjava.sql.Timestamp;importorg.apache.solr.client.solrj.beans.Field;public classGood{
@Field("id")privateString id;
@Field("number")private intnumber;
@Field("name")privateString name;
@Field("updateTime")privateTimestamp updateTime;
@OverridepublicString toString() {return "Good [id=" + id + ", number=" + number + ", name=" + name + ", updateTime=" + updateTime + "]";
}publicGood(){}public Good(String id, intnumber, String name, Timestamp updateTime) {super();this.id =id;this.number =number;this.name =name;this.updateTime =updateTime;
}publicString getId() {returnid;
}public voidsetId(String id) {this.id =id;
}public intgetNumber() {returnnumber;
}public void setNumber(intnumber) {this.number =number;
}publicString getName() {returnname;
}public voidsetName(String name) {this.name =name;
}publicTimestamp getUpdateTime() {returnupdateTime;
}public voidsetUpdateTime(Timestamp updateTime) {this.updateTime =updateTime;
}
}
每測試一次,可以在瀏覽器中通過query方式查看測試結果是否正確。