设为首页 收藏本站
查看: 966|回复: 0

[经验分享] solr开发从查询结果集中获取对象数据

[复制链接]

尚未签到

发表于 2015-7-17 10:32:33 | 显示全部楼层 |阅读模式
  solrJ从查询结果集中获取对象数据.

方案一:自定义转换方式



    /**
*
* SolrDocument与实体类转换 [测试通过]
*
* @author pudongping
*
* @param document
*                     SolrDocument对象
* @param clzz   
*                     泛型类
* @return
*/
public static  T solrDocument2Entity(SolrDocument document, Class clzz) {
if (null != document) {
try {
Object obj = clzz.newInstance();
Method m = null;
Class fieldType = null;
for (String fieldName : document.getFieldNames()) {                        
//需要说明的是返回的结果集中的FieldNames()比类属性多
Field[] filedArrays = clzz.getDeclaredFields();                        //获取类中所有属性
for (Field f : filedArrays) {   
//如果实体属性名和查询返回集中的字段名一致,填充对应的set方法
if(f.getName().equals(fieldName)){
//获取到的属性名
//private java.lang.String com.test.model.Article.id
f = clzz.getDeclaredField(fieldName);   
//属性类型
//private java.lang.String com.test.model.Article.id
fieldType = f.getType();   
//构造set方法名  setId
String dynamicSetMethod = dynamicMethodName(f.getName(), "set");
//获取方法
//public void com.test.model.Article.setId(java.lang.String)
m = clzz.getMethod(dynamicSetMethod, fieldType);
//获取到的值
LOG.info(f.getName() + "-->" + dynamicSetMethod+ "=" + fieldType.cast(document.getFieldValue(fieldName)));
// 如果是 int, float等基本类型,则需要转型
if (fieldType.equals(Integer.TYPE)) {
fieldType = Integer.class;
} else if (fieldType.equals(Float.TYPE)) {
fieldType = Float.class;
} else if (fieldType.equals(Double.TYPE)) {
fieldType = Double.class;
} else if (fieldType.equals(Boolean.TYPE)) {
fieldType = Boolean.class;
} else if (fieldType.equals(Short.TYPE)) {
fieldType = Short.class;
} else if (fieldType.equals(Long.TYPE)) {
fieldType = Long.class;
} else if(fieldType.equals(String.class)){
fieldType = String.class;
}else if(fieldType.equals(Collection.class)){
fieldType = Collection.class;
}
m.invoke(obj, fieldType.cast(document.getFieldValue(fieldName)));
}
}
}
return clzz.cast(obj);
} catch (ClassCastException e) {
LOG.error("请检查schema.xml中的各个field的数据类型与PO类的是否一致.",e);
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
LOG.error("请检查PO类中的field对应的各个setter和getter是否存在.",e);
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
LOG.error("请检查schema中的field是否不存在于PO类中.", e);
e.printStackTrace();
}
}
LOG.warn("solrDocument is null.");
return null;
}

/**
* 批量转换, 将solrDocumentList转换为实体类 List [测试通过]
*
* @author pudongping
*
* @param documents   
*                         solrDocumentList对象
* @param clzz            
*                         泛型类
*
* @return List
*
*/
public static List solrDocument2Entity(SolrDocumentList documents, Class clzz) {
if (null != documents && documents.size() > 0) {
List lists = new ArrayList();
for (SolrDocument sd : documents) {
Object obj = solrDocument2Entity(sd, clzz);
if (null!=obj) {
lists.add(clzz.cast(obj));
}
}
return lists;
}
LOG.warn("即将要转换的solrDocumentList为null或者size为0.");
return null;
}

  需要说明的是反射里边的那个双重循环
  要转换的单个SolrDocument内容如下



SolrDocument{id=2d3f7323-b212-4fae-8d69-d7fcffb0c731, title=[萧萧衷曲无处诉;为伊故,乐所苦。, 锦色芳华,岂堪人虚度?欲寄相思情万缕,捎不到,君心处。], author=柳梦璃, author_s=柳梦璃, _version_=1463433353865723904}
  而我们定义的实体类



public class Article implements Serializable{
private static final long serialVersionUID = 4017316764889231758L;
private String id;
private List title;   
private String author;   
// getter and setter
}
  SolrDocument中的fieldName个数比类的属性多,所以我们需要循环去判断.

  方案二: 基于注解的内置获取方式
  Javabean基于注解配置



package com.test.model;
import java.io.Serializable;
import java.util.List;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.solr.client.solrj.beans.Field;
public class Article implements Serializable{
/**
*
*/
private static final long serialVersionUID = 4017316764889231758L;
@Field("id")
private String id;
@Field("title")
private List title;   
@Field
private String author;            //@Field无参数时,匹配当前字段
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public List getTitle() {
return title;
}
public void setTitle(List title) {
this.title = title;
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
}
  查询结果集的两种转换方式



   
/**
* 根据关键字查询 [测试通过 - 使用 solr内部转换机制]
* @param
* @param server    solr客户端
* @param keyword    搜索关键字
* @param pageNum    当前页码
* @param pageSize    每页显示的大小
* @param clzz        对象类型
* @return
*/
public static Page queryBean(SolrServer server,String keyword,int pageNum,int pageSize, Class clzz){
SolrQuery query = new SolrQuery();
query.setQuery(keyword);
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 items = response.getBeans(clzz);
//填充page对象
return new Page(pageNum, pageSize, totalRow, items);
}
/**
* 根据关键字查询 [测试通过 - 使用 solr内部转换机制]
* @param
* @param server    solr客户端
* @param keyword    搜索关键字
* @param pageNum    当前页码
* @param pageSize    每页显示的大小
* @param clzz        对象类型
* @return
*/
public static Page queryBinderBean(SolrServer server,String keyword,int pageNum,int pageSize, Class clzz){
SolrQuery query = new SolrQuery();
query.setQuery(keyword);
query.setStart((pageNum-1)*pageSize);
query.setRows(pageSize);
QueryResponse response = null;
try {
response = server.query(query);
} catch (SolrServerException e) {
e.printStackTrace();
return null;
}
//查询结果集
SolrDocumentList documents = response.getResults();
//使用DocumentObjectBinder获取
List items = server.getBinder().getBeans(clzz,documents);
//查询到的记录总数
long totalRow = Long.valueOf(response.getResults().getNumFound()).intValue();
//填充page对象
return new Page(pageNum, pageSize, totalRow, items);
}
  Junit测试



    @Test
public void pageQueryBinder(){
Page page = SolrEngineHandler.queryBinderBean(server, "柳梦璃", 1, 10, Article.class);
System.out.println(page);
}
@Test
public void pageQueryBean(){
Page page = SolrEngineHandler.queryBean(server, "苏若年", 1, 10, Article.class);
System.out.println(page);
}
  转载请注明出处:[http://www.iyunv.com/dennisit/p/3621728.html]

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-87579-1-1.html 上篇帖子: Elasticsearch VS Solr 下篇帖子: Solr入门之(5)配置文件schema.xml
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表