java實現elasticsearch增刪該查方法
阿新 • • 發佈:2018-12-15
這篇文章旨在是幫助新接觸elasticsearch的同學快速上手es,儘早的為團隊貢獻自己的力量。
(一)往es中增加資料
import org.elasticsearch.client.Client; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.InetSocketTransportAddress; import org.elasticsearch.transport.client.PreBuiltTransportClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.net.InetAddress; public class ElasticClientUtil { private static Logger logger = LoggerFactory.getLogger(ElasticClientUtil.class); private Client client; private String clusterName; private String clusterAddress; /** * init方法 */ public void init() { try{ initClient(); }catch (Exception e){ logger.error("ElasticClientUtil->init error",e); } } /** * destory方法 */ public void destroy() { try{ if(client != null){ client.close(); } }catch (Exception e){ logger.error("ElasticClientUtil->destroy error",e); } } /** * 初始化client */ public void initClient() throws Exception { //設定叢集的名字 Settings settings = Settings.builder() .put("cluster.name", clusterName) .put("client.transport.sniff", false) .build(); //建立叢集transportClient並新增叢集節點地址 TransportClient transportClient = new PreBuiltTransportClient(settings); String[] ipPorts = clusterAddress.split(","); InetSocketTransportAddress[] addresses = new InetSocketTransportAddress[ipPorts.length]; for(int i=0;i<ipPorts.length;i++){ String ipPort = ipPorts[i]; String ip = ipPort.split(":")[0]; String port = ipPort.split(":")[1]; InetSocketTransportAddress address = new InetSocketTransportAddress(InetAddress.getByName(ip), Integer.parseInt(port)); addresses[i] = address; } this.client = transportClient.addTransportAddresses(addresses); } //-----------------------------------------------------------setter------------------------------------------------------- /** * * setter of clustername * @param clusterName * **/ public void setClusterName(String clusterName) { this.clusterName = clusterName; } /** * * getter of clustername * **/ public String getClusterName() { return clusterName; } /** * * getter of clusteraddress * **/ public String getClusterAddress() { return clusterAddress; } /** * * setter of clusteraddress * @param clusterAddress * **/ public void setClusterAddress(String clusterAddress) { this.clusterAddress = clusterAddress; } public Client getClient() { return client; } public void setClient(Client client) { this.client = client; } }
import org.elasticsearch.action.index.IndexResponse; import org.elasticsearch.client.Client; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder; @Service("testInsertElasticService") public class TestInsertElasticService { private static final Logger logger = LoggerFactory.getLogger(TestInsertElasticService.class); @Autowired private ElasticClientUtil elasticClientUtil; /** * @Description: insertTest方法 往es中插入資料重要部分 * @param: [] * @return: void * @auther: yh * @date: 2018/10/11 16:00 */ public void insertTest() { try { logger.info("==========================================es插入資料開始======================================================"); // 建立es客戶端 Client client = elasticClientUtil.getClient(); IndexResponse response = client.prepareIndex("effect_kepler", "effect_kepler", "1") .setSource(jsonBuilder() .startObject() .field("op_time", "2017-01-01") .field("bid", 1) .field("activity_id", 2) .field("actual_touch_num", 3) .field("message_click_user_num",4) .field("message_click_num", 5) .field("coupon_num_online", 6) .field("coupon_num_outline",7) .field("order_num_from_coupon_online", 8) .field("order_num_from_coupon_outline", 9) .field("add_member_num",10) .endObject() ) .execute() .actionGet(); logger.info("===========================================插入資訊結束 =================================="); } catch (Exception e) { e.printStackTrace(); logger.info("插入資料出問題了",e); } } }
(二)在es中刪除資料
/** * @Description: deleteTest方法是刪除es中id為2的資料 * @param: [] * @return: void * @auther: yh * @date: 2018/10/11 21:00 */ public void deleteTest() { logger.info("==========================================es刪除資料開始======================================================"); // 建立es客戶端 Client client = elasticClientUtil.getClient(); DeleteResponse response = client.prepareDelete("effect_kepler", "effect_kepler", "2") .execute() .actionGet(); logger.info("==========================================es刪除資料開始======================================================"); }
(三)在es中更新資料
/**
* @Description: updataTest方法是用於更新es中id為0欄位為bid的資料
* @param: []
* @return: void
* @auther: yh
* @date: 2018/10/12 10:42
*/
public void updataTest() {
logger.info("=================更新資料開始=====================");
// 建立es客戶端
Client client = elasticClientUtil.getClient();
try {
client.prepareUpdate("effect_kepler", "effect_kepler", "0")
.setDoc(jsonBuilder()
.startObject()
.field("bid", "5")
.endObject())
.get();
} catch (IOException e) {
e.printStackTrace();
}
logger.info("=================更新資料結束=====================");
}
(四)在es中查詢資料
@JProfiler(jKey = "yun_crm-service.EffectDataJsfService.searchKplEffectSms", jAppName = YunCrmConstants.UMP_APP_NAME, mState = {JProEnum.TP, JProEnum.FunctionError})
//@AppTokenCheck
@Override
/**
* @Description: searchKplEffectSms方法是用於分頁查詢es中資料
* @param: [appId, token, bid, activityId, startDate, endDate, pageNo, pageSize]
* @return: com.jd.ecodd.yun_crm.client.common.Result<com.jd.ecodd.yun_crm.client.common.Page < com.jd.ecodd.yun_crm.client.vo.effectdata.EffectSmsVO>>
* @auther: yh
* @date: 2018/10/9 13:30
*/
public Result<Page<KeplerEffectSmsVo>> searchKplEffectSms(String appId, String token, String bid, Long activityId, String startDate, String endDate, int pageNo, int pageSize) {
// 生成UUID
final String requestId = UUIDUtils.gen32UUID();
logger.info("資訊查詢介面,requestId:{},bid:{}, activityId:{},startDate:{},endDate:{}, pageNo:{},pageSize:{}", appId, token, bid, activityId, startDate, endDate, pageNo, pageSize);
// 引數校驗
Result<Page<KeplerEffectSmsVo>> result = extendParamCheck(bid, activityId, startDate, endDate, pageSize, requestId);
if (null != result) {
return result;
}
pageNo = pageNo <= 0 ? 1 : pageNo;
pageSize = pageSize > MAX_PAGE_SIZE ? MAX_PAGE_SIZE : pageSize;
// es查詢
final QueryBuilder queryBuilder = QueryBuilders.boolQuery()
.must(QueryBuilders.matchQuery("bid", bid))
.must(QueryBuilders.matchQuery("activity_id", activityId))
.must(QueryBuilders.rangeQuery("op_time").from(startDate).to(endDate));
List<SortBuilder<FieldSortBuilder>> sorts = Lists.newArrayList();
sorts.add(SortBuilders.fieldSort("op_time").order(SortOrder.ASC));
//用於排序
// sorts.add(SortBuilders.fieldSort("expected_send_num").order(SortOrder.DESC));
SearchResponse searchResponse = esQueryDocs("effect_kepler", "effect_kepler", queryBuilder, sorts, pageNo, pageSize, requestId);
// 日誌列印
logger.info("資訊查詢介面查詢結果,requestId:{},searchResponse:{}", requestId, JSON.toJSONString(searchResponse));
// 構建返回物件
result = esResponseCheck(searchResponse, pageNo, pageSize, requestId);
if (null != result) {
return result;
}
logger.info("走到這兒了==================");
// 返回值轉換
List<KeplerEffectSmsVo> keplerEffectSmsVoS = Lists.newArrayList();
List<SearchHit> searchHits = Arrays.asList(searchResponse.getHits().getHits());
for (SearchHit searchHit : searchHits) {
Map<String, Object> column = searchHit.getSource();
KeplerEffectSmsVo keplerEffectSmsVo = new KeplerEffectSmsVo();
keplerEffectSmsVo.setOpTime(column.get("op_time").toString().trim());
keplerEffectSmsVo.setBid(column.get("bid").toString().trim());
keplerEffectSmsVo.setActivityId(Long.parseLong(column.get("activity_id").toString().trim()));
keplerEffectSmsVo.setActualTouchNum(Long.parseLong(column.get("actual_touch_num").toString().trim()));
keplerEffectSmsVo.setMessageClickUserNum(Long.parseLong(column.get("message_click_user_num").toString().trim()));
keplerEffectSmsVo.setMessageClickNum(Long.parseLong(column.get("message_click_num").toString().trim()));
keplerEffectSmsVo.setCouponNumOnline(Long.parseLong(column.get("coupon_num_online").toString().trim()));
keplerEffectSmsVo.setCouponNumOutline(Long.parseLong(column.get("coupon_num_outline").toString().trim()));
keplerEffectSmsVoS.add(keplerEffectSmsVo);
}
// 日誌列印
logger.info("查詢資訊介面-ES查詢結果轉換,requestId:{},KeplerEffectSmsVoS:{}", requestId, JSON.toJSONString(keplerEffectSmsVoS));
// 構造分頁返回物件
Page<KeplerEffectSmsVo> page = new Page<KeplerEffectSmsVo>();
page.setTotal(searchResponse.getHits().getTotalHits());
page.setList(keplerEffectSmsVoS);
// 返回值
result = new Result<Page<KeplerEffectSmsVo>>();
result.setCode(BaseResponseCode.SUCCESS.getCode());
result.setMsg(BaseResponseCode.SUCCESS.getMsg());
result.setRequestId(requestId);
result.setData(page);
//列印返回值
logger.info("開普勒查詢資訊返回結果result",result);
return result;
}
下面給大家推薦ES學習與使用的兩大神器
ES權威指南
ES API文件
若有問題歡迎大家與我互動交流,可評論,可留言,以後每週我會堅持至少更新一篇部落格文章,喜歡的朋友可以加一下關注。