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]
solrj索引操作的更多相关文章
- Mongodb学习笔记三(Mongodb索引操作及性能测试)
第三章 索引操作及性能测试 索引在大数据下的重要性就不多说了 下面测试中用到了mongodb的一个客户端工具Robomongo,大家可以在网上选择下载.官网下载地址:http://www.robomo ...
- Elasticsearch-PHP 索引操作(转)
索引操作 本节通过客户端来介绍一下索引API的各种操作.索引操作包含任何管理索引本身(例如,创建索引,删除索引,更改映射等等). 我们通过一些常见的操作的代码片段来介绍,然后在表格中列出剩下的方法.R ...
- ElasticSearch+Kibana 索引操作
ElasticSearch+Kibana 索引操作 一 前言 ElasticiSearch 简介 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引 ...
- Mysql之表的操作与索引操作
表的操作: 1.表的创建: create table if not exists table_name(字段定义); 例子: create table if not exists user(id in ...
- 3.Lucene3.x API分析,Director 索引操作目录,Document,分词器
1 Lucene卡发包结构分析 包名 功能 org.apache.lucene.analysis Analysis提供自带的各种Analyzer org.apache.lucene.colla ...
- Tensor索引操作
#Tensor索引操作 ''''' Tensor支持与numpy.ndarray类似的索引操作,语法上也类似 如无特殊说明,索引出来的结果与原tensor共享内存,即修改一个,另一个会跟着修改 ''' ...
- SQL Server死锁诊断--同一行数据在不同索引操作下引起的死锁
死锁概述 对于数据库中出现的死锁,通俗地解释就是:不同Session(会话)持有一部分资源,并且同时相互排他性地申请对方持有的资源,然后双方都得不到自己想要的资源,从而造成的一种僵持的现象.当然,在任 ...
- 获取列表的索引操作:enumerate
通过循环获取列表的索引操作: 主要使用:enumerate product_list = [['Iphone7',5800], ['Coffee',30], ['疙瘩汤',10], ['Python ...
- elasticsearch的索引操作和文档操作总结
参考文档:https://es.xiaoleilu.com/010_Intro/00_README.html 一.索引操作 1.查看当前节点的所有的index 查看当前节点的所有的index [roo ...
随机推荐
- [Algorithm] Construct String from Binary Tree
You need to construct a string consists of parenthesis and integers from a binary tree with the preo ...
- C#.NET常见问题(FAQ)-如何让listView如何选中一行
把FullRowSelect设置为True 更多教学视频和资料下载,欢迎关注以下信息: 我的优酷空间: http://i.youku.com/acetaohai123 我的在线论坛: ht ...
- PHP Warning: DOMDocument::loadHTML(): htmlParseEntityRef: expecting ';' in Entity,
$html = file_get_contents("http://www.somesite.com/"); $dom = new DOMDocument(); $dom-> ...
- 数组排序 -- 结合sort和函数排序
结合sort和函数排序: 数组由小到大进行排序:sort,sortnum; var arr = [3,43,23,45,65,90]; function sortnum(a,b){ return a- ...
- js Object.create 初探
1.作用 Object.create()方法创建一个新对象,使用现有的对象来提供新创建的对象的__proto__. https://developer.mozilla.org/zh-CN/docs/W ...
- elasticsearch备忘
1.解决java.lang.RuntimeException: can not run elasticsearch as rootadduser *** //添加用户passwd *** //给用户赋 ...
- Uncaught DOMException: Failed to execute 'removeChild' on 'Node': The node ……
解决办法是加一个等待时间即可解决问题: setTimeout(function () { you code }, );
- CPU profiling
http://gernotklingler.com/blog/gprof-valgrind-gperftools-evaluation-tools-application-level-cpu-prof ...
- Echarts折线图点击事件
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- INT函数和ROUND
语法:INT(number) Number 需要进行向下舍入取整的实数