设为首页 收藏本站
查看: 1317|回复: 0

[经验分享] Solr初尝试

[复制链接]

尚未签到

发表于 2017-12-18 18:54:12 | 显示全部楼层 |阅读模式
准备Solr
下载运行solr创建一个库:    solr create -c mycore    DSC0000.png 简单实例
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();     }}依赖关系
DSC0001.png   为什么使用
  solr 是基于lucene搜索库的一个搜索引擎框架。
  1、简单来说所谓的索引是为了全文数据存储和查询准备的,全文数据即非结构化数据,比如一篇文章,如果你要用一般的手段进行搜索的话,比如用数据库的like命令会有不少限制,而且还不能支持一些相同语义的问题。
  举个简单的例子,你在亚马逊上面搜索solr,却可以查询出来lucene内容,这就是关联性查询和语义查询。
  2、高性能的,上亿条数据通过索引的方式可以秒级查询出来,优化后可能更好。
3、solr将非结构化数据,通过分词、词法分析、过滤停词、语义分析等手段来转成结构化数据,存储为索引,里面有文档概念这个和mysql的一条记录又类似。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-425474-1-1.html 上篇帖子: solr 查询 下篇帖子: 全文检索技术
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表