|
准备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搜索库的一个搜索引擎框架。
1、简单来说所谓的索引是为了全文数据存储和查询准备的,全文数据即非结构化数据,比如一篇文章,如果你要用一般的手段进行搜索的话,比如用数据库的like命令会有不少限制,而且还不能支持一些相同语义的问题。
举个简单的例子,你在亚马逊上面搜索solr,却可以查询出来lucene内容,这就是关联性查询和语义查询。
2、高性能的,上亿条数据通过索引的方式可以秒级查询出来,优化后可能更好。
3、solr将非结构化数据,通过分词、词法分析、过滤停词、语义分析等手段来转成结构化数据,存储为索引,里面有文档概念这个和mysql的一条记录又类似。 |
|
|