添加索引
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]