一、前言

  通过上一篇的讲解,我们知道了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客户端的更多相关文章

  1. 利用JAVA反射机制将JSON数据转换成JAVA对象

    net.sf.json.JSONObject为我们提供了toBean方法用来转换为JAVA对象, 功能更为强大,  这里借鉴采用JDK的反射机制, 作为简单的辅助工具使用,   有些数据类型需要进行转 ...

  2. 使用java反射机制编写Student类并保存

    定义Student类 package org; public class Student { private String _name = null; ; ; public Student() { } ...

  3. 利用JAVA反射机制设计通用的DAO

    利用JAVA反射机制设计一个通用的DAO 反射机制 反射机制指的是程序在运行时能够获取自身的信息.在java中,只要给定类的名字,    那么就可以通过反射机制来获得类的所有信息. 反射机制创建类对象 ...

  4. Java反射机制详解(1) -反射定义

    首先,我们在开始前提出一个问题: 1.在运行时,对于一个java类,能否知道属性和方法:能否去调用它的任意方法? 答案是肯定的. 本节所有目录如下: 什么是JAVA的反射机制 JDK中提供的Refle ...

  5. java反射机制的简单介绍

    参考博客: https://blog.csdn.net/mlc1218559742/article/details/52754310 先给出反射机制中常用的几个方法: Class.forName (& ...

  6. JAVA反射机制—学习总结

    最近收到很多关于Java反射机制的问题留言,其实Java反射机制技术方面没有太多难点,或许是大家在学习过程中遗漏了细小知识点,导致一些问题无法彻底理解,现在我们简单的总结一下,加深印象.什么是反射机制 ...

  7. Java 反射机制及Annotation

    转自:http://justjavac.iteye.com/blog/714654 Java 反射是 Java 语言的一个很重要的特征. 它允许运行中的 Java 程序对自身进行检查,并能直接操作程序 ...

  8. 5. Java反射机制

    Java反射机制   问题: 在运行时,对一个JAVA类,能否知道属性和方法:能否调用它的任意方法? 答案是可以的,JAVA提供一种反射机制可以实现. 目录 什么是JAVA的反射机制 JDK中提供的R ...

  9. java反射机制(2)

    首先,我们在开始前提出一个问题: 1.在运行时,对于一个java类,能否知道属性和方法:能否去调用它的任意方法? 答案是肯定的. 本节所有目录如下: 什么是JAVA的反射机制 JDK中提供的Refle ...

随机推荐

  1. 高斯消元法(Gauss Elimination)【超详解&模板】

    高斯消元法,是线性代数中的一个算法,可用来求解线性方程组,并可以求出矩阵的秩,以及求出可逆方阵的逆矩阵.高斯消元法的原理是:若用初等行变换将增广矩阵 化为 ,则AX = B与CX = D是同解方程组. ...

  2. 【2017-05-22】WebForm内置对象:Application和ViewState、Repeater的Command用法

    一.内置对象 1.Application 存贮在服务器端,占用服务器内存生命周期:永久 所有人访问的都是这一个对象 传值:传的是object类型可以传对象. string s =TextBox1.Te ...

  3. swift MBProgressHUD加载gif或者apng的动图

    效果图 给MBProgressHUD添加一个分类(extension) extension MBProgressHUD { /// MBProgressHUD 显示加载gif hud方法 /// // ...

  4. 关于微信小程序遇到的wx.request({})问题

    域名请求错误问题 当我们在编写小程序,要发送请求时,wx.request({})时或许会遇到如下的问题: 一:这是因为微信小程序的开发中,域名只能是https方式请求,所以我们必须在小程序微信公众平台 ...

  5. 关于Python编码,超诡异的,我也是醉了

    Python的编码问题,真是让人醉了.最近碰到的问题还真不少.比如中文文件名.csv .python对外呈现不一致啊,感觉好不公平. 没图说个JB,下面立马上图.   我早些时候的其他脚本,csv都是 ...

  6. ubuntu16.04的下载安装

    工具/原料   ubuntu-16.04-desktop-amd64.iso ubuntu-16.04-desktop-i386.iso UltraISO最新版 (自己找渠道去下载,用来将镜像文件烧到 ...

  7. excel vba 实现跨表单(sheet) 搜索 - 显示搜索行记录搜索历史

    前两天,一个朋友问我,有没有办法在excel里实现一个表单里是原始数据,在另一个表单里显示搜索到的行,搜索关键词可用~分隔开,并把搜索历史记录下来? 我想了想,用vba实现肯定可以啊,但是我又在想,有 ...

  8. Javascript创建类和对象

    现总结一下Javascript创建类和对象的几种方法: 1.原始的创建方法: <script type="text/javascript"> var person = ...

  9. CentOS7使用rpm包安装MySQL

    说明 本文写于2017-05-20,使用MySQL-5.7.18.操作系统为64位CentOS Linux release 7.2.1511 (Core),以桌面形式安装. 卸载MariaDB Cen ...

  10. javascript获取json对象的key名称的两种方法

    javascript获取json对象的key名称的两种方法 数据处理中,你可能接收到一个不确定内容格式的json对象,然后要把key的值提取出来.今天试过两种可以提取json key的方法,均可以正常 ...