利用java反射机制编写solr通用的java客户端
一、前言
通过上一篇的讲解,我们知道了dynamicFiled字段,它是动态的,不需要显示的声明。而且一些常用的基本类型solr已经默认给我们创建好了。
例如:*_i,*_is,等。
如果我们要使用动态字段,字段的命名就需要符合上述规则。solr为我们提供了大量的动态字段:

二、实体类的编写
在这里,我们以创建商品的索引为例,创建实体如下:
@Getter@Setter
public class Product {
//商品id,而且是必有字段
private String id;
//商品名称,是字符串类型,所以我们以"_s"结尾
private String proName_s;
//商品架构 是double型,所以以"_d"结尾
private Double price_d;
//商品分类 是字符串类型,而且一个商品可以有多个分类,是多值,所以我们用“_ss”结尾
private List<String> tag_ss;
}
三、solrj编写java通用客户端
我们主要是通过java的反射机制和泛型来编写:
package com.urwork.tools.solr; import com.urwork.tools.page.Page;
import org.apache.commons.collections.CollectionUtils;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.impl.CloudSolrClient;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument; import java.io.IOException;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List; /**
* Created by xxx on xxxx/xx/xx.
*/
public class SolrCloudClient {
private CloudSolrClient server=null; /**
* 构造函数
* @param zkAddr zk地址:192.168.2.233:2181,192.168.2.234:2181,192.168.2.235:2181
* @param collection collection名字: company
*/
private SolrCloudClient(String zkAddr,String collection) {
server = new CloudSolrClient.Builder().withZkHost(zkAddr).build();
server.setDefaultCollection(collection);
} /**
* 删除集合中的所有数据
* @throws Exception
*/
public void deleteAll() throws Exception {
server.deleteByQuery("*:*");
server.commit();
} /**
* 根据id删除集合中的数据
* @param id
* @throws Exception
*/
public void deleteById(String id) throws Exception {
server.deleteById(id);
server.commit();
} /**
* 根据ids删除集合中的数据
* @param ids
* @throws Exception
*/
public void deleteByIds(List<String> ids) throws Exception {
server.deleteById(ids);
server.commit();
} /**
* 批量更新索引
* @param docs
* @param <T>
* @throws Exception
*/
public <T> void addList(List<T> docs) throws Exception {
if (CollectionUtils.isEmpty(docs)){
return;
}
List<SolrInputDocument> list = new ArrayList<>();
for (T doc:docs){
Field[] declaredFields = doc.getClass().getDeclaredFields();
SolrInputDocument sid = new SolrInputDocument();
for (Field field : declaredFields){
field.setAccessible(true);
String name = field.getName();
Object value = field.get(doc);
if (value!=null){
sid.addField(name,value);
}
list.add(sid);
}
} server.add(list);
server.commit();
} /**
* 添加单条索引
* @param doc
* @param <T>
* @throws Exception
*/
public <T> void add(T doc) throws Exception {
List<T> docs = new ArrayList<>();
docs.add(doc);
addList(docs);
} /**
* 更新一条索引
* @param doc
* @param <T>
* @throws Exception
*/
public <T> void update(T doc)throws Exception{
Field idField = doc.getClass().getDeclaredField("id");
if (idField == null){
throw new RuntimeException("your document doesn't have id");
}
idField.setAccessible(true);
Object id = idField.get(doc);
deleteById(id+"");
add(doc);
} /**
* 批量更新索引
* @param docs
* @param <T>
* @throws Exception
*/
public <T> void updateList(List<T> docs) throws Exception {
if (CollectionUtils.isEmpty(docs)){
return;
}
List<String> ids = new ArrayList<>();
for (T doc : docs){
Field idField = doc.getClass().getDeclaredField("id");
if (idField!=null){
idField.setAccessible(true);
Object id = idField.get(doc);
ids.add(id+"");
}
}
deleteByIds(ids);
addList(docs);
} /**
* 执行查询
* @param clazz 对应的class
* @param page Page分页
* @param query 查询条件
* @param <T>
* @return
* @throws Exception
*/
public <T> Page<T> search(Class<T> clazz,Page<T> page, SolrQuery query) throws Exception {
query.setStart((page.getCurrentPageNo()-1)*page.getPageSize());
query.setRows(page.getPageSize()); QueryResponse response = server.query(query);
SolrDocumentList results = response.getResults();
List<T> rtnList = new ArrayList<>();
for (SolrDocument doc : results){
T instance = clazz.newInstance();
Field[] declaredFields = instance.getClass().getDeclaredFields();
for (Field filed : declaredFields){
filed.setAccessible(true);
String name = filed.getName();
Object fieldValue =doc.getFieldValue(name);
filed.set(instance,fieldValue);
}
rtnList.add(instance);
}
page.setResult(rtnList);
page.setTotalRecord((int)results.getNumFound());
return page;
} public void close() throws IOException {
server.close();
} }
我们在创建实体类时,字段的名称按照动态值的规则命名,在构建索引和查询时,就可以使用公共类来实现。
利用java反射机制编写solr通用的java客户端的更多相关文章
- 利用JAVA反射机制将JSON数据转换成JAVA对象
net.sf.json.JSONObject为我们提供了toBean方法用来转换为JAVA对象, 功能更为强大, 这里借鉴采用JDK的反射机制, 作为简单的辅助工具使用, 有些数据类型需要进行转 ...
- 使用java反射机制编写Student类并保存
定义Student类 package org; public class Student { private String _name = null; ; ; public Student() { } ...
- 利用JAVA反射机制设计通用的DAO
利用JAVA反射机制设计一个通用的DAO 反射机制 反射机制指的是程序在运行时能够获取自身的信息.在java中,只要给定类的名字, 那么就可以通过反射机制来获得类的所有信息. 反射机制创建类对象 ...
- Java反射机制详解(1) -反射定义
首先,我们在开始前提出一个问题: 1.在运行时,对于一个java类,能否知道属性和方法:能否去调用它的任意方法? 答案是肯定的. 本节所有目录如下: 什么是JAVA的反射机制 JDK中提供的Refle ...
- java反射机制的简单介绍
参考博客: https://blog.csdn.net/mlc1218559742/article/details/52754310 先给出反射机制中常用的几个方法: Class.forName (& ...
- JAVA反射机制—学习总结
最近收到很多关于Java反射机制的问题留言,其实Java反射机制技术方面没有太多难点,或许是大家在学习过程中遗漏了细小知识点,导致一些问题无法彻底理解,现在我们简单的总结一下,加深印象.什么是反射机制 ...
- Java 反射机制及Annotation
转自:http://justjavac.iteye.com/blog/714654 Java 反射是 Java 语言的一个很重要的特征. 它允许运行中的 Java 程序对自身进行检查,并能直接操作程序 ...
- 5. Java反射机制
Java反射机制 问题: 在运行时,对一个JAVA类,能否知道属性和方法:能否调用它的任意方法? 答案是可以的,JAVA提供一种反射机制可以实现. 目录 什么是JAVA的反射机制 JDK中提供的R ...
- java反射机制(2)
首先,我们在开始前提出一个问题: 1.在运行时,对于一个java类,能否知道属性和方法:能否去调用它的任意方法? 答案是肯定的. 本节所有目录如下: 什么是JAVA的反射机制 JDK中提供的Refle ...
随机推荐
- ZooKeeper实践:(2)集群管理
前言: 随着业务的扩大,用户的增多,访问量的增加,单机模式已经不能支撑,从而出现了从单机模式->垂直应用模式->集群模式,集群模式诞生了,伴随着一堆问题也油然而生,Master怎么选举,机 ...
- React入门---可复用组件-10
主要对props更多重要的特性进行学习; 还是用之前代码, index.js代码为: var React = require('react'); var ReactDOM = require('rea ...
- React入门---组件嵌套-5
组件嵌套 我们现在需要组件嵌套,所以要创建其他组件,目前有一个头部组件,在./components/header.js; 接下来在components文件中创建:底部组件footer.js 和主体组件 ...
- MySQL ProxySQL读写分离实践
目的 在上一篇文章MySQL ProxySQL读写分离使用初探里初步介绍了ProxySQL的使用,本文继续介绍它的一些特点和DBProxy的性能差异.深入一些去了解ProxySQL,通过测试来说明Pr ...
- CI 经常失败?可能是这 5 大原因…
本文翻译自文章 Top 5 Reasons for CI Failure,主要介绍了 CI 失败的五个原因,包括 CI 服务的错误选择.CI 工程师的不专业性.随意更改CI服务器配置.CI服务器性能差 ...
- 打不开磁盘“I:\xxx.vmdk”或它所依赖的某个快照磁盘
参考:http://zyp88.blog.51cto.com/1481591/1566504 "打不开磁盘"I:\XXX.vmdk"或它所依赖的某个快照磁盘 " ...
- Java基础知识二次学习-- 第二章 基础语法与递归补充
第二章 基础语法与递归补充 时间:2017年4月24日10:39:18 章节:02章_01节,02章_02节 视频长度:49:21 + 15:45 内容:标识符,关键字与数据类型 心得:由字母,下 ...
- SG函数和SG定理【详解】
在介绍SG函数和SG定理之前我们先介绍介绍必胜点与必败点吧. 必胜点和必败点的概念: P点:必败点,换而言之,就是谁处于此位置,则在双方操作正确的情况下必败. N点:必胜点 ...
- arcgis sde 导出栅格文件失败,提示“Database user name and current user schema do not match ”.
具体错误/警告如下: 翻译一下:数据库用户名和当前用户数据库对象的集合不匹配 没有空间参考存在 数据库表没找到 主要还是第一句的问题. 解决方法:切换当前sde账户为能够写入sde的账户,这块不是很了 ...
- Maximum Subarray Sum
Maximum Subarray Sum 题意 给你一个大小为N的数组和另外一个整数M.你的目标是找到每个子数组的和对M取余数的最大值.子数组是指原数组的任意连续元素的子集. 分析 参考 求出前缀和, ...