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 solrUrlint 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 <= numi++) {
            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(fieldNameoper);
        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的一条记录又类似。


<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">

posted @ 2017-11-20 15:33  鹿回头  阅读(167)  评论(0编辑  收藏  举报