Elasticsearch 5.4.3实战--Java API调用:批量写入数据
这个其实比较简单,直接上代码.
注意部分逻辑可以换成你自己的逻辑
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调用:批量写入数据的更多相关文章
- Elasticsearch 5.4.3实战--Java API调用:索引mapping创建
因为项目开发使用的是Java语言, 项目的开发架构是Spring MVC+ maven的jar包管理, 所以今天重点说说ES 5.4.3 的Java API的源码实战 1. pom.xml文件增加依 ...
- Elasticsearch 5.4.3实战--Java API调用:搜索建议
通常的搜索引擎,都会根据用户的输入,实时给予匹配的提示. 那么这个功能在elasticsearch中如何实现呢? Elasticsearch里设计了4种类别的Suggester,分别是: Term S ...
- Elasticsearch 5.4.3实战--Java API调用:搜索
ES有多种查询方式,我自己的业务是需要对多个字段进行查询,具体实现类代码如下. package com.cs99lzzs.elasticsearch.service.imp; import java. ...
- java连接mysql批量写入数据
1.采用公认的MYSQL最快批量提交办法 public void index() throws UnsupportedEncodingException, Exception { //1000个一提交 ...
- HBase BulkLoad批量写入数据实战
1.概述 在进行数据传输中,批量加载数据到HBase集群有多种方式,比如通过HBase API进行批量写入数据.使用Sqoop工具批量导数到HBase集群.使用MapReduce批量导入等.这些方式, ...
- [搜索]ElasticSearch Java Api(一) -添加数据创建索引
转载:http://blog.csdn.net/napoay/article/details/51707023 ElasticSearch JAVA API官网文档:https://www.elast ...
- elasticsearch REST API方式批量插入数据
elasticsearch REST API方式批量插入数据 1:ES的服务地址 http://127.0.0.1:9600/_bulk 2:请求的数据体,注意数据的最后一行记得加换行 { &quo ...
- Java使用iBatis批量插入数据到Oracle数据库
Java使用iBatis批量插入数据到Oracle数据库 因为我们的数据跨库(mysql,oracle),单独取数据的话需要遍历好多遍,所以就想着先从mysql数据库中取出来的数据然后在oracle数 ...
- Redis和nosql简介,api调用;Redis数据功能(String类型的数据处理);List数据结构(及Java调用处理);Hash数据结构;Set数据结构功能;sortedSet(有序集合)数
1.Redis和nosql简介,api调用 14.1/ nosql介绍 NoSQL:一类新出现的数据库(not only sql),它的特点: 1. 不支持SQL语法 2. 存储结构跟传统关系型数 ...
随机推荐
- Druid数据源配置
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-met ...
- python3: requests模块的使用;
requests库常用于http请求,可以很方便对网页进行爬取: 主要方法(七个): 方法 解释 requests.request() 构造一个请求,支持以下各种方法 requests.get() 获 ...
- go 方法
go 方法 Golang中的任何自定义类型,都可以有方法,而不仅仅是struct. 定义:func (recevier type) methodName(参数列表)(返回值列表){} 方法的访问控制, ...
- eslint相关工具
eslint工具 1. vscode搜索eslint安装,就可以在写代码时报eslint的错误了 2.文件 --> 首选项 --> 设置 --> 选ESLint --> 勾选A ...
- Helm简介及安装
前提条件 一个kubernetes集群 安装和配置集群端服务Helm和Tiller 确定要应用于安装的安全配置(如果有) 1.安装HELM 每一个版本HELM提供多种操作系统的二进制版本.可以手动下载 ...
- Canvas判断内容为空
如题,项目需要做一个canvas的绘图工具,绘制图纸传递给后台.因此需要做一个非空验证,记录解决方法祝大家早日脱坑. js验证代码: //验证canvas画布是否为空函数function isCanv ...
- a标签与js的冲突
如上图,需要做一个页面,点击左边的标题,右边就显示左边标题下的子标题的集合, html代码如下: <div id="newleft"> <ul> <l ...
- [Android] Android 使用Greendao gradle 出现 Error:Unable to find method 'org.gradle.api.tasks.TaskInputs.file(Ljava/lang/Object;)
Android 使用Greendao gradle 出现 Error:Unable to find method 'org.gradle.api.tasks.TaskInputs.file(Ljava ...
- electron-vue项目搭建
参考:https://simulatedgreg.gitbooks.io/electron-vue/content/cn/getting_started.html 1. cnpm install -g ...
- JavaSE回顾及巩固的自学之路(二)——————进入JavaSE
好的.今天接着上一篇文章对JavaSE的历程初步介绍,开始对JavaSE的技术性知识进行探讨. 首先,选择编程,成为一名程序员,应该会了解一些计算机的相关基础知识,毕竟,以后就是和计算机打交道了嘛.s ...