準備Solr
下載運行solr
建立一個庫:
solr
create -c
mycore
簡單實例
package com.util;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.UUID;
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.request.UpdateRequest;
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;
public class SolrjUtil {
//solr 服務器地址
private String solrUrl;
//操做工具
private HttpSolrClient client;
//zookeeper 服務地址(咱們這邊能夠不用)
private String zkUrl;
private String collectionName;
/**
* 構造器
* @param solrUrl
* @param num
*/
public SolrjUtil(String solrUrl, int num) {
this.solrUrl = solrUrl;
this.client = createNewSolrClient();
}
// public SolrjUtil(String zkUrl, int num, String collection) {
// this.zkUrl = zkUrl;
// this.num = num;
// collectionName = collection;
// this.client = createCouldSolrClient();
// }
/**
*
* @return
*/
private HttpSolrClient createNewSolrClient() {
try {
System.out.println("server address:" + solrUrl);
HttpSolrClient client = new HttpSolrClient(solrUrl);
client.setConnectionTimeout(30000);
client.setDefaultMaxConnectionsPerHost(100);
client.setMaxTotalConnections(100);
client.setSoTimeout(30000);
return client;
} catch (Exception ex) {
throw new RuntimeException(ex);
}
}
// private SolrClient createCouldSolrClient() {
// CloudSolrClient client = new CloudSolrClient(zkUrl);
// client.setZkClientTimeout(30000);
// client.setZkConnectTimeout(50000);
// client.setDefaultCollection(collectionName);
// return client;
// }
/**
* client關閉方法
*/
public void close() {
try {
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 建立一個測試文檔
*/
public void createOneDoc() {
System.out.println("======================add doc ===================");
SolrInputDocument doc1 = new SolrInputDocument();
doc1.addField("id", UUID.randomUUID().toString(), 1.0f);
doc1.addField("name", "bean");
doc1.addField("equIP_s", "192.168.2.104");
doc1.addField("level_s", "4");
doc1.addField("collectPro_s", "ffffffffffffffffffffjajajajajajdddddddddd");
doc1.addField("sourceType_s", "miaohqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
doc1.addField("filePath_s", "/home/xxxx/test");
doc1.addField("filename_s", "zhonggggmaiaiadadadddddddddddddddddddddddddd");// doc1.addField("_route_",
// "shard1");
try {
UpdateResponse rsp = client.add(doc1);
System.out
.println("Add doc size 1, result:" + rsp.getStatus() + " Qtime:" + rsp.getQTime());
UpdateResponse rspcommit = client.commit();
System.out.println("commit doc to index" + " result:" + rsp.getStatus() + " Qtime:" + rsp.getQTime());
} catch (SolrServerException | IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 批量建立測試文檔
* 這裏須要作:考慮傳遞多參數仍是引用對象,並修改該方法
* @param num 建立文檔的數量
*/
public void createDocs(int num) {
System.out.println("======================add doc ===================");
Collection<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();
for (int i = 1; i <= num; i++) {
SolrInputDocument doc1 = new SolrInputDocument();
doc1.addField("id", UUID.randomUUID().toString(), 1.0f);
doc1.addField("name", "bean");
doc1.addField("equIP_s", "192.168.2.104");
doc1.addField("level_s", "4");
doc1.addField("collectPro_s", "ffffffffffffffffffffjajajajajajdddddddddd");
doc1.addField("sourceType_s", "miaohqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
doc1.addField("filePath_s", "/home/xxxx/test");
doc1.addField("filename_s", "zhonggggmaiaiadadadddddddddddddddddddddddddd");// doc1.addField("_route_",
// "shard1");
docs.add(doc1);
}
try {
UpdateResponse rsp = client.add(docs);
System.out
.println("Add doc size" + docs.size() + " result:" + rsp.getStatus() + " Qtime:" + rsp.getQTime());
UpdateResponse rspcommit = client.commit();
System.out.println("commit doc to index" + " result:" + rsp.getStatus() + " Qtime:" + rsp.getQTime());
} catch (SolrServerException | IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 根據id刪除
* @param id
*/
public void deleteById(String id) {
System.out.println("======================deleteById ===================");
try {
UpdateResponse rsp = client.deleteById(id);
client.commit();
System.out.println("delete id:" + id + " result:" + rsp.getStatus() + " Qtime:" + rsp.getQTime());
} catch (SolrServerException | IOException e) {
e.printStackTrace();
}
}
/**
* 根據屬性刪除
* @param queryCon
*/
public void deleteByQuery(String queryCon) {
System.out.println("======================deleteByQuery ===================");
UpdateResponse rsp;
try {
UpdateRequest commit = new UpdateRequest();
commit.deleteByQuery(queryCon);
commit.setCommitWithin(5000);
commit.process(client);
System.out
.println("url:" + commit.getPath() + "\t xml:" + commit.getXML() + " method:" + commit.getMethod());
// rsp = client.deleteByQuery(queryCon);
// client.commit();
// System.out.println("delete query:" + queryCon + " result:" + rsp.getStatus()
// + " Qtime:" + rsp.getQTime());
} catch (SolrServerException | IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 查詢方法1
* @throws Exception
*/
public void query1000() throws Exception {
SolrQuery query = new SolrQuery();
query.setQuery("*:*");
query.setStart(0);// 開始記錄數
query.setRows(10000);// 總條數
QueryResponse queryResponse = client.query(query);
SolrDocumentList results = queryResponse.getResults();
System.out.println("總條數爲:" + results.getNumFound());
for (int i = 0; i < results.size(); i++) {
System.out.println(results.get(i).getFieldNames());
for (String name : results.get(i).getFieldNames()) {
System.out.println(results.get(i).getFieldValue(name));
}
}
}
/**
* 查詢方法2
*/
public void queryDocs() {
SolrQuery params = new SolrQuery();
System.out.println("======================query===================");
// params.setQuery("name:bean");
// params.setQuery("level_s:4");
params.set("q", "name:bean");
params.set("start", 0);
params.set("rows", 2);
params.set("sort", "accesstime_s desc");
try {
QueryResponse rsp = client.query(params);
SolrDocumentList docs = rsp.getResults();
System.out.println("查詢內容:" + params);
System.out.println("文檔數量:" + docs.getNumFound());
System.out.println("查詢花費時間:" + rsp.getQTime());
System.out.println("------query data:------");
// for (SolrDocument doc : docs) {
// // 多值查詢
// @SuppressWarnings("unchecked")
// List<String> collectTime = (List<String>) doc.getFieldValue("collectTime");
// String clientmac_s = (String) doc.getFieldValue("clientmac_s");
// System.out.println("collectTime:" + collectTime + "\t clientmac_s:" + clientmac_s);
// }
SolrDocumentList results = rsp.getResults();
for (int i = 0; i < results.size(); i++) {
System.out.println("////////////////////////////////////////////////////////");
System.out.println("//第" + (i+1) +"個值");
System.out.println("////////////////////////////////////////////////////////");
// System.out.println("******************全部FieldName*****************");
// System.out.println(results.get(i).getFieldNames());
System.out.println("******************全部FieldName和FieldValue*****************");
Object[] names = results.get(i).getFieldNames().toArray();
int j = 0;
for (String name : results.get(i).getFieldNames()) {
System.out.println(names[j++] + ":" + results.get(i).getFieldValue(name));
}
}
System.out.println("-----------------------");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 修改文檔屬性
* @param id
* @param fieldName
* @param fieldValue
*/
public void updateField(String id, String fieldName, Object fieldValue) {
System.out.println("======================updateField ===================");
HashMap<String, Object> oper = new HashMap<String, Object>();
// 多值更新方法
// List<String> mulitValues = new ArrayList<String>();
// mulitValues.add(fieldName);
// mulitValues.add((String)fieldValue);
oper.put("set", fieldValue);
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id", id);
doc.addField(fieldName, oper);
try {
UpdateResponse rsp = client.add(doc);
System.out.println("update doc id" + id + " result:" + rsp.getStatus() + " Qtime:" + rsp.getQTime());
UpdateResponse rspCommit = client.commit();
System.out.println(
"commit doc to index" + " result:" + rspCommit.getStatus() + " Qtime:" + rspCommit.getQTime());
} catch (SolrServerException | IOException e) {
e.printStackTrace();
}
}
public static void main(String args[]) {
//地址說明:ip:port/solr/庫名 ;建立庫命令: solr create -c mycore
String url = "http://localhost:8983/solr/mycore";
String zkUrl = "127.0.0.1:9983";
// PropertyConfigurator.configure("./etc/log4j.properties");
SolrjUtil ss = new SolrjUtil(url, 2);
// SolrjUtil sc = new SolrjUtil(zkUrl, 2, "test201607");
// 添加文檔
// ss.createDocs(3);
// ss.createOneDoc();
// 刪除文檔
// ss.deleteById("00cda454-bd3d-4945-814f-afa7110dcd21");
// ss.deleteByQuery("name:bean");
//更新文檔
// ss.updateField("bd67564f-4939-4de1-9a83-3483ebbbbbee", "name", "1233313131313");
// ss.close();
// 查詢文檔
ss.queryDocs();
// try {
// ss.queryAll();
// } catch (Exception e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
ss.close();
}
}
依賴關係
爲何使用
solr 是基於lucene搜索庫的一個搜索引擎框架。
一、簡單來講所謂的索引是爲了全文數據存儲和查詢準備的,全文數據即非結構化數據,好比一篇文章,若是你要用通常的手段進行搜索的話,好比用數據庫的like命令會有很多限制,並且還不能支持一些相同語義的問題。
舉個簡單的例子,你在亞馬遜上面搜索solr,卻能夠查詢出來lucene內容,這就是關聯性查詢和語義查詢。java
二、高性能的,上億條數據經過索引的方式能夠秒級查詢出來,優化後可能更好。mysql
三、solr將非結構化數據,經過分詞、詞法分析、過濾停詞、語義分析等手段來轉成結構化數據,存儲爲索引,裏面有文檔概念這個和mysql的一條記錄又相似。