• solrj索引操作


    添加索引

    Solr添加文档至索引: http://www.cnblogs.com/dennisit/p/3621717.html

    删除索引:

    每天索引记录有一个唯一标识,索引的删除通过唯一标识操作,如下实例展示索引的删除.

    删除单个索引

        /**
         * 根据id从索引中删除记录[测试通过]
         * @param server
         * @param idName    主键名
         * @param id        主键值
         */
        public static void deleteById(SolrServer server, String idName, Object id){
            try {
                server.deleteByQuery(idName + ":" + id.toString());
                server.commit(false, false);
                LOG.info("Delete from index by id" + id + " finished . operate param is:" + idName + ":" + id.toString());
            } catch (Exception e) {
                LOG.error("Delete from index by id" + id + " error, " + e.getMessage(), e);
            }
        }

    批量删除索引

        
        /**
         * 根据id集合从索引中删除记录[测试通过]
         * @param server
         * @param ids
         */
        public static <T> void deleteByIds(SolrServer server, String idName,List<T> ids){
            try {
                if (ids.size() > 0) {
                    StringBuffer query = new StringBuffer(idName + ":" + ids.get(0));
                    for (int i = 1; i < ids.size(); i++) {
                        if (null != ids.get(i)) {
                            query.append(" OR " + idName + ":" + ids.get(i).toString());
                        }
                    }
                    server.deleteByQuery(query.toString());
                    server.commit(false, false);
                    LOG.info("Delete from index by id list" + ids + " finished .");
                }else{
                    LOG.info("Delete ids list is null.");
                }
            } catch (Exception e) {
                LOG.error("Delete from index by id list" + ids + " error, " + e.getMessage(), e);
                e.printStackTrace();
            }
        }

    根据查询删除索引

        /**
         * 根据查询从索引中删除[测试通过]
         * @param server
         * @param queryString
         */
        public static void deleteByQuery(SolrServer server,String query){
            try {
                server.deleteByQuery(query);
                server.commit(false, false);
                LOG.info("Delete from index by query string " + query + "finished .");
            } catch (Exception e) {
                LOG.error("Delete from index by query Strng " + query + "error, " + e.getMessage(), e);
                e.printStackTrace();
            }
        }

    根据对象删除

        /**
         * 根据对象删除,实质是根据Id删除
         * 
         * @param server    solr客户端
         * @param object    删除的对象
         * @param idName    对象的主键名
         */
        public static void deleteBean(SolrServer server,Object object,String idName){
            Class<?> cls = object.getClass();
            try {
                Method method = cls.getMethod(EntityConvert.dynamicMethodName(idName, "get"));
                Object o = method.invoke(object);
                if (o != null) {
                    deleteById(server,idName,method.invoke(object));
                }
                LOG.info("Delete from index by object" + object);
            } catch (Exception e) {
                LOG.error("Delete from index by object error, " + e.getMessage() ,e);
                e.printStackTrace();
            }
        }

    删除所有索引

        
        /**
         * 删除所有索引 [测试通过]
         * @param server
         */
        public static void deleteAllIndex(SolrServer server){
            try {
                server.deleteByQuery("*:*");
                server.commit(false, false);
                LOG.info("All index delete finished.");
            } catch (Exception e) {
                LOG.error("Delete all index error " + e.getMessage(), e);
                e.printStackTrace();
            }
        }

    修改索引

        /**
         * 更新单个记录    [测试通过]
         * @author pudongping
         * 
         * @param server
         *                     Solr客户端
         * @param object
         *                     要更新成的对象
         * @param idName    
         *                     主键id名
         */
        public static void updateBean(SolrServer server,Object object,String idName){
            if(null!=object && StringUtils.isNotBlank(idName)){
                Class<?> clzz = object.getClass();
                try {
                    Method method = clzz.getMethod(EntityConvert.dynamicMethodName(idName, "get"));
                    Object o = method.invoke(object);
                    if(null != o){
                        SolrQuery query = new SolrQuery();
                        query.setQuery(idName + ":" + o.toString());
                        query.setStart(0);
                        query.setRows(1);
                        QueryResponse response = server.query(query);
                        SolrDocument document = response.getResults().get(0);
                        LOG.info("更新一个记录" + EntityConvert.solrDocument2Entity(document, clzz));
                        System.out.println("更新一个记录" + EntityConvert.solrDocument2Entity(document, clzz));
                        UpdateRequest updateRequest = new UpdateRequest();
                        updateRequest.setAction(AbstractUpdateRequest.ACTION.COMMIT, false, false);
                        updateRequest.add(solrDocument2SolrInputDocument(document, object));
                        updateRequest.process(server);
                    }
                } catch (NoSuchMethodException e) {
                    LOG.error("Update bean error"  + object);
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    LOG.error("Update bean error"  + object);
                    e.printStackTrace();
                } catch (IllegalArgumentException e) {
                    LOG.error("Update bean error"  + object);
                    e.printStackTrace();
                } catch (Exception e) {
                    LOG.error("Update bean error"  + object);
                    e.printStackTrace();
                }
            }
        }
        

    所谓更新,无非是根据唯一标识查询出来,然后重新赋值.在solr中我们查询出来的结果为SolrDocument对象,而updateRequest.add(..)的对象为SolrInputDocument对象.所以我们需要编写这两个对象的转换

        
        /**
         * [测试通过]
         * 
         * 更新数据时用到,给出要更新的对象,Id为必须给出的属性,然后加上要更新的属性
         * 如果对应的属性的值为空或者为0,这不需要更新
         * 
         * @param sd 查询到得SolrDocument
         * @param object
         * @return SolrInputDocument
         */
        public static SolrInputDocument solrDocument2SolrInputDocument(SolrDocument sd, Object object) {
            if (object != null && sd != null) {
                SolrInputDocument sid = new SolrInputDocument();
                Collection<String> fieldNameCollection = sd.getFieldNames();            // 得到所有的属性名
                Class<?> cls = object.getClass();
                Object o = null;
                for (String fieldName : fieldNameCollection) {
                    try {
                        //需要说明的是返回的结果集中的FieldNames()比类属性多
                        Field[] filedArrays = cls.getDeclaredFields();                        //获取类中所有属性
                        for (Field f : filedArrays) {    
                            //如果实体属性名和查询返回集中的字段名一致,填充对应的set方法
                            if(f.getName().equals(fieldName)){
                                
                                    // 如果对应的属性的值为空或者为0,这不需要更新
                                    o = cls.getMethod(EntityConvert.dynamicMethodName(fieldName, "get")).invoke(object);
                                    Class<?> fieldType = cls.getDeclaredField(fieldName).getType();
                                    
                                    if (fieldType.equals(Integer.TYPE)) {
                                        Integer fieldValue = Integer.class.cast(o);
                                        if (fieldValue != null && fieldValue.compareTo(0) != 0) {
                                            sid.addField(fieldName, fieldValue);
                                        }
                                    } else if (fieldType.equals(Float.TYPE)) {
                                        Float fieldValue = Float.class.cast(o);
                                        if (fieldValue != null && fieldValue.compareTo(0f) != 0) {
                                            sid.addField(fieldName, fieldValue);
                                        }
                                    } else if (fieldType.equals(Double.TYPE)) {
                                        Double fieldValue = Double.class.cast(o);
                                        if (fieldValue != null && fieldValue.compareTo(0d) != 0) {
                                            sid.addField(fieldName, fieldValue);
                                        }
                                    } else if (fieldType.equals(Short.TYPE)) {
                                        Short fieldValue = Short.class.cast(o);
                                        if (fieldValue != null && fieldValue.compareTo((short)0) != 0) {
                                            sid.addField(fieldName, fieldValue);
                                        }
                                    } else if (fieldType.equals(Long.TYPE)) {
                                        Long fieldValue = Long.class.cast(o);
                                        if (fieldValue != null && fieldValue.compareTo((long)0) != 0) {
                                            sid.addField(fieldName, fieldValue);
                                        }
                                    } else if(fieldType.equals(List.class)){
                                        List fieldValue = List.class.cast(o);
                                        if(fieldValue != null){
                                            sid.addField(fieldName, fieldValue);
                                        }
                                    }else {
                                        if (o != null) {
                                            sid.addField(fieldName, o.toString());
                                        }
                                    }
                            }
                        }
                    
                    } catch (IllegalArgumentException e) {
                        e.printStackTrace();
                    } catch (SecurityException e) {
                        e.printStackTrace();
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    } catch (InvocationTargetException e) {
                        e.printStackTrace();
                    } catch (NoSuchMethodException e) {
                        LOG.error("请检查PO类中的field对应的各个setter和getter是否存在!");
                        e.printStackTrace();
                    } catch (NoSuchFieldException e) {
                        LOG.error("请检查schema中的field是否不存在于PO类中!");
                        e.printStackTrace();
                    }
                }
                return sid;
            }
            LOG.warn("即将要转换的SolrDocument或者要更新的Object为null");
            return null;
        }

    查询索引

        /**
         * 根据关键字查询 [测试通过 - 使用 solr内部转换机制]
         * @param <T>
         * @param server    solr客户端
         * @param solrql     sql查询串
         * @param pageNum    当前页码
         * @param pageSize    每页显示的大小
         * @param clzz        对象类型
         * @return
         */
        public static <T>Page<T> query(SolrServer server,String solrql,int pageNum,int pageSize, Class<T> clzz){
            SolrQuery query = new SolrQuery();
            query.setQuery(solrql);
            query.setStart((pageNum-1)*pageSize);
            query.setRows(pageSize);
            QueryResponse response = null;
            try {
                response = server.query(query);
            } catch (SolrServerException e) {
                e.printStackTrace();
                return null;
            }
            
            //查询到的记录总数
            long totalRow = Long.valueOf(response.getResults().getNumFound()).intValue();
            //查询结果集
            List<T> items = response.getBeans(clzz);
            //填充page对象
            return new Page<T>(pageNum, pageSize, totalRow, items);
        }

    查询说明,参看这篇文章: http://www.cnblogs.com/huangfox/archive/2012/02/13/2348949.html

    转载请注明出处:[http://www.cnblogs.com/dennisit/p/3623974.html]

  • 相关阅读:
    QTP自动化测试进阶
    疯狂Java实战演义
    软件开发之韵:和谐敏捷
    Android应用开发详解
    操作系统直接决定了计算机系统的整体性能
    iBATIS框架源码剖析
    PHP 5完全攻略
    天气地图系统
    OpenSolaris系统管理
    Asp.net MVC 3实例学习之ExtShop(三)——完成首页
  • 原文地址:https://www.cnblogs.com/dennisit/p/3623974.html
Copyright © 2020-2023  润新知