liuxiaoyun111 发表于 2017-12-18 18:54:12

Solr初尝试

准备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 + ":" + 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的一条记录又类似。
页: [1]
查看完整版本: Solr初尝试