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

[经验分享] solr开发,提交索引数据的几种方式

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-7-16 14:23:27 | 显示全部楼层 |阅读模式
  今天抽空学习了一下solr,有新东西学习就是哈皮! 期待能有机会与实战.实例仅为个人理解学习实例.
提交到Solr服务器上的数据必须是 SolrInputDocument 类型.

  方案一:利用反射,自定义转换机制
  JavaBean对象转换成SolrInputDocument的方式我们可以自定义.如果我们的Model类符合JavaBean的规范,那么我们可以使用反射获取其内部信息.



   
/**
* @author dennisit@163.com
*
* 实体类与SolrInputDocument转换 [测试通过]
*
* @param obj
*                         实体对象
* @return SolrInputDocument
*                         SolrInputDocument对象
*/
public static SolrInputDocument entity2SolrInputDocument(Object obj) {
if (obj != null) {
Class cls = obj.getClass();
Field[] filedArrays = cls.getDeclaredFields();                        //获取类中所有属性
Method m = null;
SolrInputDocument sid = new SolrInputDocument();
for (Field f : filedArrays) {
//因为如果对象序列化之后,会增加该属性,不用对该属性进行反射
if(!f.getName().equals("serialVersionUID")){                        
try {
//跟进属性xx构造对应的getXx()方法
String dynamicGetMethod = dynamicMethodName(f.getName(), "get");
//调用构造的getXx()方法
m = cls.getMethod(dynamicGetMethod);   
//属性名,与对应的属性值 get方法获取到的值
LOG.info(f.getName() + ":" + m.invoke(obj));
sid.addField(""+ f.getName(), m.invoke(obj));
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
}
return sid;
}
LOG.warn("Object to convert is null.");
return null;
}
  此时我们可以使用server中提供的添加solrInputDocument对象的方法进行数据建立索引.



   
/**
* 将对象集合添加至索引[测试通过]
* @author pudongping
* @param server
* @param lists    自定义转换机制
*/
public static  void addConvertBeans(SolrServer server, List lists){
try {
server.add(EntityConvert.entityList2SolrInputDocument(lists));
server.commit(false, false);
LOG.info("Add convert object list to index finished. ");
} catch (Exception e) {
LOG.error("Add convert object list to index error, " + e.getMessage(), e);
}
}

/**
* 将对象集合添加至索引[测试通过]
* @author pudongping
* @param server
* @param lists    自定义转换机制
*/
public static  void addConvertBeans(SolrServer server, List lists){
try {
server.add(EntityConvert.entityList2SolrInputDocument(lists));
server.commit(false, false);
LOG.info("Add convert object list to index finished. ");
} catch (Exception e) {
LOG.error("Add convert object list to index error, " + e.getMessage(), e);
}
}

  测试自定义转换对象建立索引.



    @Test
public void addConvertBean(){
Article article1 = new Article();
article1.setId(UUID.randomUUID().toString());
List title = new ArrayList();
title.add("我在门后假装你人还没走");
article1.setTitle(title);
article1.setAuthor("周杰伦");
SolrEngineHandler.addConvertBean(server, article1);
}
@Test
public void addConvertBeans(){
List lists = new ArrayList();
Article art1 = new Article();
art1.setId(UUID.randomUUID().toString());
List atlts1 = new ArrayList();
atlts1.add("谁言别后终无悔,寒月清宵绮梦回");
atlts1.add("深知身在情长在,前尘不共彩云飞");
art1.setTitle(atlts1);
art1.setAuthor("柳梦璃");
lists.add(art1);
Article art2 = new Article();
art2.setId(UUID.randomUUID().toString());
List atlts2 = new ArrayList();
atlts2.add("萧萧衷曲无处诉;为伊故,乐所苦。");
atlts2.add("锦色芳华,岂堪人虚度?欲寄相思情万缕,捎不到,君心处。");
art2.setTitle(atlts2);
art2.setAuthor("柳梦璃");
lists.add(art2);
SolrEngineHandler.addConvertBeans(server, lists);
}
  方法二: 使用solr提供的注解机制
  说明: @Field无参数时,匹配当前字段,也可以自定义,字段必须在schema.xml 中的Filed中存在.



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);
}
}


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);
}
}
  使用solrJ提供的addBean(..)与addBeans(…)相关的方法添加对象



    /**
* 将单个对象添加至索引
* @author pudongping
* @param server
* @param object  solr机制进行对象转换
*/
public static void addBean(SolrServer server, Object object){
try {
server.addBean(object);
server.commit(false,false);
LOG.info("Add object to index finished.");
} catch (Exception e) {
LOG.error("Add object to index error, " + e.getMessage(), e);
e.printStackTrace();
}
}

/**
* 添加集合对象至索引 [测试通过]
* @author pudongping
* @param
* @param server
* @param lists    使用solr内部转换机制
*/
public static  void addBeans(SolrServer server, List lists){
try {
server.addBeans(lists);
server.commit(false, false);
LOG.info("Add object list to index finished. ");
} catch (Exception e) {
LOG.error("Add object list to index finished. ");
}
}

  编写junit测试



    @Test
public void addBean(){
Article article1 = new Article();
article1.setId(UUID.randomUUID().toString());
List title = new ArrayList();
title.add("地图青岛,末世孤岛.");
article1.setTitle(title);
article1.setAuthor("苏若年");
SolrEngineHandler.addBean(server, article1);
}
@Test
public void addBeans(){
List lists = new ArrayList();
Article art1 = new Article();
art1.setId(UUID.randomUUID().toString());
List atlts1 = new ArrayList();
atlts1.add("谁言别后终无悔,寒月清宵绮梦回");
atlts1.add("深知身在情长在,前尘不共彩云飞");
art1.setTitle(atlts1);
art1.setAuthor("苏若年");
lists.add(art1);
Article art2 = new Article();
art2.setId(UUID.randomUUID().toString());
List atlts2 = new ArrayList();
atlts2.add("萧萧衷曲无处诉;为伊故,乐所苦。");
atlts2.add("锦色芳华,岂堪人虚度?欲寄相思情万缕,捎不到,君心处。");
art2.setTitle(atlts2);
art2.setAuthor("柳梦璃");
lists.add(art2);
SolrEngineHandler.addBeans(server, lists);
}

   转载请注明出处:[http://www.iyunv.com/dennisit/p/3621717.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-87379-1-1.html 上篇帖子: solr实例代码 import org.apache.solr.client.solrj.SolrServer 下篇帖子: 基于Solr的空间搜索
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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