准备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的一条记录又相似。