利用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 ...
随机推荐
- 用css3动画 @keyframes里设置transform:rotate(); 控制动画暂停和运动用属性:animation-play-state:paused暂停,在微信和safari里设置paused无效,在QQ里是正常的
这几天遇到了两个很奇葩的问题,终于找到原因,趁还记得解决方法,赶紧记下来: 用css3动画 @keyframes里设置transform:rotate(); 控制动画暂停和运动可以用属性:animat ...
- 同步文件的利器-rsync
即使你只是个人用户而不是一个企业,备份你自己的数据也是非常重要的,我不想失去任何这些数据. rsync是同步文件的利器,一般用于多个机器之间的文件同步与备份,同时也支持在本地的不同目录之间互相同步文件 ...
- VBS
1.msgbox脚本显示回车 语法:msgbox"123"&vbcrlf&"456"
- 《Android进阶》之第一篇 在Java中调用C库函数
在Java代码中通过JNI调用C函数的步骤如下: 第一步:编写Java代码 class HelloJNI{ native void printHello(); native void printStr ...
- Android onclick监听事件打开新界面
一.新建工程 二.新建XML代码 新建一个Button <Button android:layout_width="wrap_content" android:layout_ ...
- JAVA POI 应用系列(1)--生成Excel
POI简介(官网:http://poi.apache.org/) Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office ...
- pick off your glasses
我一直在想,为什么带眼镜时间长了机不愿意再摘下来呢,或者说摘下来感觉很不舒服.当然了,这更多的是内心里的一种感觉而已. 其实,我突然认为这是一种不自信,在这样一个物欲横流的社会中,当你眼前模模糊糊,而 ...
- EF通用数据层封装类(支持读写分离,一主多从)
浅谈orm 记得四年前在学校第一次接触到 Ling to Sql,那时候瞬间发现不用手写sql语句是多么的方便,后面慢慢的接触了许多orm框架,像 EF,Dapper,Hibernate,Servic ...
- HTML5录音控件
最近的项目又需要用到录音,年前有过调研,再次翻出来使用,这里做一个记录. HTML5提供了录音支持,因此可以方便使用HTML5来录音,来实现录音.语音识别等功能,语音开发必备.但是ES标准提供的API ...
- 借用mysql 或者其他数据库 处理MSSQL 2016前处理导入特殊字符
MSSQL 2016支持了utf8编码的文件,之前处理比较麻烦的bcp 方式导入特殊字符一下子就方便了. 但是之前的版本,处理起来还是有一点麻烦.这次处理使用的数据库版本是sql server 201 ...