这个其实比较简单,直接上代码.

注意部分逻辑可以换成你自己的逻辑

 package com.cs99lzzs.elasticsearch.service.imp;

 import java.sql.Timestamp;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import javax.annotation.Resource; import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.elasticsearch.action.bulk.BulkRequestBuilder;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.client.Client;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; @Service("productIndexService")
public class ProductIndexServiceImp implements ProductIndexService { @Resource
private TradeService tradeService; @Resource
private ProductService productService; @Resource
private ShopService shopService; @Resource(name="esClient")
Client esClient; @Value("${elasticsearch.index}")
private String CLUSTER_INDEX; @Value("${elasticsearch.type}")
private String CLUSTER_TYPE; private static final int _DEFAULT_PAGE_SIZE = 50; private static final Logger logger = Logger.getLogger(ProductIndexServiceImp.class); @Override
public void createIndex(Timestamp updateTime) {
DecimalFormat decimalFormat = new DecimalFormat("#0.0");
int page = 1;
List<SKU> skus = null; long startTime = System.currentTimeMillis();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
logger.info("elasticsearch索引构建开始,开始时间:" + sdf.format(new Date())); while (true) {
//获取当页的sku列表
StringBuffer sb = new StringBuffer(1000);
skus = productService.getSkus(updateTime, page, _DEFAULT_PAGE_SIZE);
if(skus == null|| skus.isEmpty()){
break;
}
//批量写入
BulkRequestBuilder bulkRequest = esClient.prepareBulk(); for(SKU sku:skus){
try {
if(sku:skus == null){
logger.error("elasticsearch: skuId=" + sku.getId() + "对应的SPU或者Brand或者Cate对象为空,无需构建索引");
continue;
}
Map<String, Object> source = putToMap(sku);
bulkRequest.add(esClient
.prepareIndex(CLUSTER_INDEX, CLUSTER_TYPE, "" + elasticseachSku.getId())
.setSource(source));
sb.append(sku.getId()).append(",");
} catch (Exception e) {
logger.error("更新elasticsearch索引出现异常, skuId=" + sku.getId() + ",exception info is:"
+ e.getMessage() + ", e.Cause is " + e.getCause());
}
} BulkResponse response = bulkRequest.execute().actionGet();
if (response == null || response.hasFailures()) {
logger.error("elasticsearch 批量构建索引失败, failure message is: " + response.buildFailureMessage());
} else {
logger.info("elasticsearch 批量构建索引成功, skuId list is : " + sb.toString());
}
page ++;
}
logger.info("elasticsearch本次索引构建时间:" + (System.currentTimeMillis() - startTime)/1000 + "秒。");
logger.info("elasticsearch索引构建任务结束,结束时间:" + sdf.format(new Date()));
} /**
* @param elasticseachSku
* @return
*/
private Map<String, Object> putToMap(Sku elasticseachSku) { Map<String, Object> source = new HashMap<String, Object>();
source.put("brandZhName", elasticseachSku.getBrandZhName());
source.put("brandEnName", elasticseachSku.getBrandEnName());
source.put("brandAliases", elasticseachSku.getBrandAliases());
source.put("aliases", elasticseachSku.getAliases());
source.put("zhName", elasticseachSku.getZhName());
source.put("enName", elasticseachSku.getEnName());
source.put("brandZhName", elasticseachSku.getBrandZhName()); /* suggester */
List<String> nameList = new ArrayList<String>();
if (StringUtils.isNotEmpty(elasticseachSku.getZhName())) {
nameList.add(elasticseachSku.getZhName());
}
if (StringUtils.isNotEmpty(elasticseachSku.getBrandZhName())) {
nameList.add(elasticseachSku.getBrandZhName());
}
if (StringUtils.isNotEmpty(elasticseachSku.getAliases())) {
nameList.add(elasticseachSku.getAliases());
}
if (StringUtils.isNotEmpty(elasticseachSku.getEnName())) {
nameList.add(elasticseachSku.getEnName());
}
if (StringUtils.isNotEmpty(elasticseachSku.getBrandEnName())) {
nameList.add(elasticseachSku.getBrandEnName());
}
if (StringUtils.isNotEmpty(elasticseachSku.getBrandAliases())) {
nameList.add(elasticseachSku.getBrandAliases());
}
if (nameList.size() > 0) {
source.put("suggestName", nameList);
} return source;
}
}

Elasticsearch 5.4.3实战--Java API调用:批量写入数据的更多相关文章

  1. Elasticsearch 5.4.3实战--Java API调用:索引mapping创建

    因为项目开发使用的是Java语言, 项目的开发架构是Spring MVC+ maven的jar包管理,  所以今天重点说说ES 5.4.3 的Java API的源码实战 1. pom.xml文件增加依 ...

  2. Elasticsearch 5.4.3实战--Java API调用:搜索建议

    通常的搜索引擎,都会根据用户的输入,实时给予匹配的提示. 那么这个功能在elasticsearch中如何实现呢? Elasticsearch里设计了4种类别的Suggester,分别是: Term S ...

  3. Elasticsearch 5.4.3实战--Java API调用:搜索

    ES有多种查询方式,我自己的业务是需要对多个字段进行查询,具体实现类代码如下. package com.cs99lzzs.elasticsearch.service.imp; import java. ...

  4. java连接mysql批量写入数据

    1.采用公认的MYSQL最快批量提交办法 public void index() throws UnsupportedEncodingException, Exception { //1000个一提交 ...

  5. HBase BulkLoad批量写入数据实战

    1.概述 在进行数据传输中,批量加载数据到HBase集群有多种方式,比如通过HBase API进行批量写入数据.使用Sqoop工具批量导数到HBase集群.使用MapReduce批量导入等.这些方式, ...

  6. [搜索]ElasticSearch Java Api(一) -添加数据创建索引

    转载:http://blog.csdn.net/napoay/article/details/51707023 ElasticSearch JAVA API官网文档:https://www.elast ...

  7. elasticsearch REST API方式批量插入数据

    elasticsearch REST API方式批量插入数据 1:ES的服务地址  http://127.0.0.1:9600/_bulk 2:请求的数据体,注意数据的最后一行记得加换行 { &quo ...

  8. Java使用iBatis批量插入数据到Oracle数据库

    Java使用iBatis批量插入数据到Oracle数据库 因为我们的数据跨库(mysql,oracle),单独取数据的话需要遍历好多遍,所以就想着先从mysql数据库中取出来的数据然后在oracle数 ...

  9. Redis和nosql简介,api调用;Redis数据功能(String类型的数据处理);List数据结构(及Java调用处理);Hash数据结构;Set数据结构功能;sortedSet(有序集合)数

    1.Redis和nosql简介,api调用 14.1/ nosql介绍 NoSQL:一类新出现的数据库(not only sql),它的特点: 1.  不支持SQL语法 2.  存储结构跟传统关系型数 ...

随机推荐

  1. C# WebApi过滤器(开发接口必备利器)

    在WEB Api中,引入了面向切面编程(AOP)的思想,在某些特定的位置可以插入特定的Filter进行过程拦截处理.引入了这一机制可以更好地践行DRY(Don’t Repeat Yourself)思想 ...

  2. 【强大的Java集成开发工具】MyEclipse 2015 Stable 2.0 for Mac

    [简介] MyEclipse是一款 Mac 上的Java 强大的集成开发工具,今天和大家分享最新的 MyEclipse 2015 Stable 2.0 版本,MyEclipse 2015 基于 Ecl ...

  3. UVA11527Unique Snowflakes(滑动窗口 + set判重 | | map)

    题意:输入长度为n的序列a,找到一个尽量长的连续子序列a[l] - a[r],使该序列中没有相同的元素 紫薯P239 序列元素从0开始编号,l 和 r 分别表示子序列左右端点,初始化为0,固定 l,判 ...

  4. Django REST Framework限速

    官方文档:http://www.django-rest-framework.org/api-guide/throttling/#throttling settings.py配置 REST_FRAMEW ...

  5. 01--STL泛型编程了解

    开始学习侯捷老师的课程了~~ 一:六大组件关系 容器(Container) 算法(Algorithm) 迭代器(Iterator) 仿函数(Function object) 适配器(Adaptor) ...

  6. springboot下整合redis使用redisTemplate模板

    pom <!-- 引入 redis 依赖 --> <dependency> <groupId>org.springframework.boot</groupI ...

  7. Trap 冷启动与热启动告警

    冷启动: 设备断电重启. 热启动: snmp agent 从未使能到使能的操作会产生此告警.

  8. Sublime Text3 里使用MarkDown如何预览

    安装需要的包: 1.markdown editing 2.markdown preview 具体的步骤是: 1.按住ctrl + shift + p 来调出一个弹出的输入框 :2.输入package  ...

  9. 基于zookeeper(集群)+LevelDB的ActiveMq高可用集群安装、配置、测试

    一. zookeeper安装(集群):http://www.cnblogs.com/wangfajun/p/8692117.html  √ 二. ActiveMq配置: 1. ActiveMq集群部署 ...

  10. ruby----%使用法

    %{String}  用于创建一个使用双引号括起来的字符串,这个表示法与%Q{String}完全一样 result = %{hello} puts "result is: #{result} ...