利用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 ...
随机推荐
- Day3-递归函数、高阶函数、匿名函数
一.递归函数 定义:函数内部可以调用其它函数,如果调用自身,就叫递归. 递归特性: 1.必须有结束条件退出: >>> def calc(n): ... print(n) ... re ...
- /proc/kcore失效,调试其文件系统相关模块,使重新正常工作
为分析内核,在有限的机器上用虚拟机装了CentOS.6.9.i386.minimal,重新编译了3.19.8内核并克隆.当使用/proc/kcore进行内核动态映像调试时,发现与kgdb远程调试端读到 ...
- 面试(4)-spring-Spring面试题和答案
1:69道Spring面试题和答案 转自:http://ifeve.com/spring-interview-questions-and-answers/ 目录 Spring 概述 依赖注入 Spri ...
- 11.Java 加解密技术系列之 总结
Java 加解密技术系列之 总结 序 背景 分类 常用算法 原理 关于代码 结束语 序 上一篇文章中简单的介绍了第二种非对称加密算法 — — DH,这种算法也经常被叫做密钥交换协议,它主要是针对密钥的 ...
- 009一对一 主键关联映射_单向(one-to-one)
009一对一 主键关联映射_单向(one-to-one) ² 两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ² 有两种策略可以实现一对一的关联映射 主键关联:即让两个 ...
- Python一切皆对象
Python从设计之初就是一门面向对象的语言,它有一个重要的概念,即一切皆对象. Java虽然也是面向对象编程的语言,但是血统没有Python纯正.比如Java的八种基本数据类型之一int,在持久化的 ...
- node--更新数据库问题
昨天测试blog的comment功能,在新增comment相关的代码之后,重启应用,出现Cannot call method 'forEach' of undefined .反复核对代码,都没发现异常 ...
- LINUX 硬盘分区及文件系统
一,top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器. 1. 第一行是任务队列信息 2. 第二.三行为进程和CPU的信息 3. 第 ...
- 总结scala(一)
由于笔记太多,分为了几部分,进入我的博客,查看其它的笔记 scala:面向对象,函数式编程 一.声明变量 1.变量的类型 Byte,Char,Short,Int,Long,Float,Double,B ...
- Spring+SpringMVc+Mybatis实现数据库查询
大家好,本篇博客小Y将会给大家带来一篇SSM框架实现数据查询的Demo,使用的数据库是Mysql,Server是TomCat.现在的SSM整合非常流行,因为springmvc的高效和mybatis的灵 ...