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

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

 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#语法糖(Csharp Syntactic sugar)

    目录 一.C#语法糖大汇总 1. 经过简化的Property2. 经过两次变异的委托写法3. 集合类的声明4. 集合类各个项的操作5. using == try finally6. 可爱的var7. ...

  2. vmware centos7 网络配置

    1. 在vmware创建centos虚拟机 2. 在cmd下看一下本机所处的网段,并对一下vmware上的配置 如果同样处于同一网段(192.168.aaa.bbb,aaa处一致就行),就可以直接开机 ...

  3. gcc生成含有C信息的汇编

    title: gcc生成含有C信息的汇编 tags: gcc date: 2018-10-24 23:40:19 --- https://www.cnblogs.com/fengkang1008/p/ ...

  4. MySQL5.7 的GTID复制

    MySQL5.7 的GTID复制 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 在MySQL5.6之后其官方推出了GTID复制方式,和传统的基于bin log复制方式有所不同,接 ...

  5. Zabbix Server 监控Web页面

    Zabbix Server 监控Web页面 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.  1>.选中一台可以连接互联网的主机 2>.创建一个web场景,点击“Crea ...

  6. 启动oracle的步骤

    启动oracle的步骤 Linux下启动oracle分为以下两步: 1.1.启动lsnrctl监听. 1.2.启动数据库实例. 启动oracle监听 首先登陆服务器,切换到oracle用户. [adm ...

  7. hibernate HQL查询参数设置

    Hibernate中对动态查询参数绑定提供了丰富的支持,那么什么是查询参数动态绑定呢?其实如果我们熟悉传统JDBC编程的话,我们就不难理解查询参数动态绑定,如下代码传统JDBC的参数绑定: Prepa ...

  8. hdu 6418(石头剪刀布 **)

    题意是说双方各有剪刀,石头和布的卡片各 a,b,c,a‘,b',c' 张,对方是随机选择,问我方的最大预期得分. 这道题目一开始看到的时候感觉没有头绪,再次读题,发现题目说结果可能是分数,如果是分数的 ...

  9. JAVA中局部变量 和 成员变量有哪些区别

    JAVA中局部变量 和 成员变量有哪些区别 1.定义的位置不一样<重点>***局部变量:在方法的内部成员变量:在方法的外部,直接写在类当中 2.作用范围不一样<重点>***局部 ...

  10. functools学习记录

    装饰器demo def wrapper(func): print('装饰器工作了') def inner(*args,**kwargs): return func(*args,**kwargs) re ...