今天抽空学习了一下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 <T> void addConvertBeans(SolrServer server, List<T> 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 <T> void addConvertBeans(SolrServer server, List<T> 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<String> title = new ArrayList<String>();
title.add("我在门后假装你人还没走");
article1.setTitle(title);
article1.setAuthor("周杰伦");
SolrEngineHandler.addConvertBean(server, article1); } @Test
public void addConvertBeans(){
List<Article> lists = new ArrayList<Article>();
Article art1 = new Article();
art1.setId(UUID.randomUUID().toString());
List<String> atlts1 = new ArrayList<String>();
atlts1.add("谁言别后终无悔,寒月清宵绮梦回");
atlts1.add("深知身在情长在,前尘不共彩云飞");
art1.setTitle(atlts1);
art1.setAuthor("柳梦璃");
lists.add(art1); Article art2 = new Article();
art2.setId(UUID.randomUUID().toString());
List<String> atlts2 = new ArrayList<String>();
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<String> 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<String> getTitle() {
return title;
}
public void setTitle(List<String> 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<String> 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<String> getTitle() {
return title;
}
public void setTitle(List<String> 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 <T>
* @param server
* @param lists 使用solr内部转换机制
*/
public static <T> void addBeans(SolrServer server, List<T> 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<String> title = new ArrayList<String>();
title.add("地图青岛,末世孤岛.");
article1.setTitle(title);
article1.setAuthor("苏若年");
SolrEngineHandler.addBean(server, article1);
} @Test
public void addBeans(){
List<Article> lists = new ArrayList<Article>();
Article art1 = new Article();
art1.setId(UUID.randomUUID().toString());
List<String> atlts1 = new ArrayList<String>();
atlts1.add("谁言别后终无悔,寒月清宵绮梦回");
atlts1.add("深知身在情长在,前尘不共彩云飞");
art1.setTitle(atlts1);
art1.setAuthor("苏若年");
lists.add(art1); Article art2 = new Article();
art2.setId(UUID.randomUUID().toString());
List<String> atlts2 = new ArrayList<String>();
atlts2.add("萧萧衷曲无处诉;为伊故,乐所苦。");
atlts2.add("锦色芳华,岂堪人虚度?欲寄相思情万缕,捎不到,君心处。");
art2.setTitle(atlts2);
art2.setAuthor("柳梦璃");
lists.add(art2);
SolrEngineHandler.addBeans(server, lists);
}

转载请注明出处:[http://www.cnblogs.com/dennisit/p/3621717.html]

solr开发,提交索引数据的几种方式的更多相关文章

  1. Solr 16 - 增删改Solr中索引数据的几种方式 (在URL上或Web页面中操作)

    目录 1 添加/更新索引数据 1.1 JSON格式的操作 1.2 XML格式的操作 2 删除索引数据 2.1 删除符合特定条件的数据 2.2 删除指定ID的数据 2.3 删除全部索引数据 3 在doc ...

  2. Solr 删除数据的几种方式

    原文出处:http://blog.chenlb.com/2010/03/solr-delete-data.html 有时候需要删除 Solr 中的数据(特别是不重做索引的系统中,在重做索引期间).删除 ...

  3. 讨论HTTP POST 提交数据的几种方式

    转自:http://www.cnblogs.com/softidea/p/5745369.html HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS.GET.HEAD.POST.PU ...

  4. solr删除全部索引数据

    SOLR 删除全部索引数据: <delete><query>*:*</query></delete><commit/>

  5. ajax数据提交数据的三种方式和jquery的事件委托

    ajax数据提交数据的三种方式 1.只是字符串或数字 $.ajax({ url: 'http//www.baidu.com', type: 'GET/POST', data: {'k1':'v1'}, ...

  6. Linux就这个范儿 第15章 七种武器 linux 同步IO: sync、fsync与fdatasync Linux中的内存大页面huge page/large page David Cutler Linux读写内存数据的三种方式

    Linux就这个范儿 第15章 七种武器  linux 同步IO: sync.fsync与fdatasync   Linux中的内存大页面huge page/large page  David Cut ...

  7. oracle 批量删除表数据的4种方式

      1.情景展示 情景一: 删除PRIMARY_INDEX_TEST表中,MINDEX_ID字段为空的数据 情景二: 删除VIRTUAL_CARD_TEST表中的脏数据 2.解决方案 情景一的解决方案 ...

  8. Day20-单表中获取表单数据的3种方式

    1. 搭建环境请参考:http://www.cnblogs.com/momo8238/p/7508677.html 2. 创建表结构 models.py from django.db import m ...

  9. SparkStreaming与Kafka,SparkStreaming接收Kafka数据的两种方式

    SparkStreaming接收Kafka数据的两种方式 SparkStreaming接收数据原理 一.SparkStreaming + Kafka Receiver模式 二.SparkStreami ...

随机推荐

  1. Docker-machine创建虚机时停在虚机启动的提示上,并且创建的虚机显示Ip Not found

    Docker-machine创建虚机时停在虚机启动的提示上,并且创建的虚机用docker-machine ls 列出来的时候显示Ip Not found, 是什么原因那? [答案] 看这个帖子: ht ...

  2. 构造并发送Beacon帧以伪造任意WiFi热点

    请想象一下这样的情景:你可以任意伪造很多个WiFi热点, 这个技术只能在linux上使用,而且对无线网卡也有一定的挑剔,具体的下面会讲- 阶段一:基本原理 首先需要搞清楚的是,手机.电脑等支持WiFi ...

  3. Windows 10 中的 Shell 指令

    这篇文章本无技术含量,也不高大上,不过想想,还是写下来吧,肯定有人会用得到的. 常玩系统的朋友,应该知道 Shell 指令,这是一个很好玩很神奇的指令.利用它,可以用简短的单词,轻易地打开系统中的一些 ...

  4. Go语言中Socket通信之Tcp客户端

    1.用法: (1)定义远程IP地址.使用net.ResolveTCPAddr()方法,定义一个TCP地址,做为目标连接地址. (2)调用net.DialTCP("tcp",nil, ...

  5. 通过httpclient3实现文件下载以及获取文件下载名称

    package httpclient3test; import java.io.File; import java.io.FileNotFoundException; import java.io.F ...

  6. 移动端H5的一些基本知识点总结

    移动端H5的一些基本知识点总结 来到这家公司之后,和曾经的工作发生了非常大的转变.曾经我一直是做PC端页面的.来到如今这家公司之后,主要是做手机移动端的页面. 移动端的页面在我这个做习惯了PC端页面的 ...

  7. C# Chart控件的使用总结1

    (1)来自SQL server 此时就可以用查询语句,来获取你要用到的数据 (要引用如下命名空间: using System.Data.SqlClient; usingSystem.Windows.F ...

  8. Android学习笔记九:Service

    一:Service是什么 Service,服务.一般用于提供需要在后台长期运行的服务(如复杂计算.下载等等耗时任务),其特点是长生命周期的.没有用户界面.在后台运行的. 二:Service的生命周期方 ...

  9. cocos2d-js 越来越慢的定时器schedule 制作不变慢的定时器

    对于动画控制,可能一点误差,大家不会察觉,但如果多次循环累积或网络同步等,大家就会很清楚意识到schedule的误差问题. 首先做一个例子证明一下: var InaccuracyTestLayer = ...

  10. mybatis-generator生成逆向工程两种方式

    本文博客地址:http://blog.csdn.net/soonfly/article/details/64499423 逆向工程下载 链接:https://pan.baidu.com/s/1YOAq ...