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

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

 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. 一个关于finally和return的面试题

    public class Test{ public int add(int a,int b){ try { return a+b; } catch (Exception e) { System.out ...

  2. Golang的排序和查找

    Golang的排序和查找 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.排序的基本介绍 排序是将一组数据,依指定的顺序进行排列的过程.排序的分类如下 1>.内部排序 指将 ...

  3. MyBatis-Select 流程

    mybatis 版本:3.5.1 测试代码: public interface MyUserMapperAnnotation { @Select("select * from myuser ...

  4. python 深浅拷贝 for循环删除

    ###########################总结########################### 1. 基础数据类型补充 大多数的基本数据类型的知识.已经学完了 a='aaaa' ls ...

  5. mssql的 for xml path 与 mysql中的group_concat类似MSSQL For xml Path

    /****** Script for SelectTopNRows command from SSMS ******/ SELECT D_ID,[D_Name] as Name FROM [LFBMP ...

  6. Web项目发布BUG总结

    1.字符集乱码问题: 这是一个常遇见的问题,但总是解决不了,让人很头疼笔者最近就遇到了这个问题.首先确保你传入的数据是UTF-8格式的,如果你是用jsp+servlert写的话,你的servlert中 ...

  7. [C#]一个简易的、轻量级的方法并行执行线程辅助类

      一个简易的.轻量级的方法并行执行线程辅助类 在实际应用中,经常要让多个方法并行执行以节约运行时间,线程就是必不可少的了,而多线程的管理经常又是一件头疼的事情,比如方法并行执行异步的返回问题,方法并 ...

  8. 阅读:ECMAScript 6 入门(1)

    参考 ECMAScript 6 入门 ES6新特性概览 ES6 全套教程 ECMAScript6 (原著:阮一峰) JavaScript 教程 重新介绍 JavaScript(JS 教程) 前言 学了 ...

  9. ACM-ICPC 2018 徐州赛区网络预赛 I Characters with Hash(模拟)

    https://nanti.jisuanke.com/t/31461 题意 一个hash规则,每个字母映射成一个两位数,求给的字符串最后的编码位数,要求去除最终结果的前导零 分析 按题意模拟就是了 # ...

  10. ACM-ICPC 2018 南京赛区网络预赛 C GDY(模拟)

    https://nanti.jisuanke.com/t/30992 题意 把m张牌(牌上数字范围是1-13)放到栈里n个人,每个人首次从栈顶取5张牌,轮流取取完牌后,第1个人出他手里最小的牌,然后2 ...