elasticsearch实践之代码结构设计

Map<String, Object> source = searchHit.getSourceAsMap();

jsonArray.add(JSONObject.parseObject(JSON.toJSONString(source)));

}

result.setList(jsonArray);

} catch (Exception e) {

throw new ApiElasticSearchException(“【查询索引】” + e.getMessage());

}

return result;

}

/**

* 通过queryBuilder+SortBuilder+highlightBuilder查询

*

* @param index

* @param type

* @param queryBuilder

* @param sortBuilderList

* @param highlightBuilder

* @return

*/

@Override

public ElasticSearchList getIndex(String index, String type, QueryBuilder queryBuilder, List<SortBuilder<?>> sortBuilderList, HighlightBuilder highlightBuilder) {

ElasticSearchList result = new ElasticSearchList();

try {

SearchRequestBuilder searchRequestBuilder = getTransportClient.prepareSearch(index).setTypes(type);

if (null != queryBuilder) {

searchRequestBuilder.setQuery(queryBuilder);

}

if (null != sortBuilderList) {

for (SortBuilder<?> sortBuilder : sortBuilderList) {

searchRequestBuilder.addSort(sortBuilder);

}

}

if (null != highlightBuilder) {

searchRequestBuilder.highlighter(highlightBuilder);

}

SearchResponse searchResponse = searchRequestBuilder.setExplain(true).execute().actionGet();

// 处理高亮

result.setList(ElasticSearchUtil.handleHighlight(searchResponse.getHits()));

} catch (Exception e) {

throw new ApiElasticSearchException(“【查询索引】” + e.getMessage());

}

return result;

}

/**

* 通过queryBuilder+SortBuilder+highlightBuilder+AggregationBuilder查询

*

* @param index

* @param type

* @param queryBuilder

* @param sortBuilderList

* @param highlightBuilder

* @param aggregationBuilderList

* @return

*/

@Override

public ElasticSearchList getIndex(String index, String type, QueryBuilder queryBuilder, List<SortBuilder<?>> sortBuilderList, HighlightBuilder highlightBuilder, List aggregationBuilderList) {

ElasticSearchList result = new ElasticSearchList();

try {

SearchRequestBuilder searchRequestBuilder = getTransportClient.prepareSearch(index).setTypes(type);

if (null != queryBuilder) {

searchRequestBuilder.setQuery(queryBuilder);

}

if (null != sortBuilderList) {

for (SortBuilder<?> sortBuilder : sortBuilderList) {

searchRequestBuilder.addSort(sortBuilder);

}

}

if (null != highlightBuilder) {

searchRequestBuilder.highlighter(highlightBuilder);

}

if (null != aggregationBuilderList) {

for (AggregationBuilder aggregationBuilder : aggregationBuilderList) {

searchRequestBuilder.addAggregation(aggregationBuilder);

}

}

SearchResponse searchResponse = searchRequestBuilder.setExplain(true).execute().actionGet();

// 处理高亮

result.setList(ElasticSearchUtil.handleHighlight(searchResponse.getHits()));

// 处理聚合

result.setAggregation(ElasticSearchUtil.handleAggregations(searchResponse.getAggregations()));

} catch (Exception e) {

throw new ApiElasticSearchException(“【查询索引】” + e.getMessage());

}

return result;

}

/**

* 通过queryBuilder分页查询

*

* @param index

* @param type

* @param queryBuilder

* @param pageNo

* @param pageSize

* @return

*/

@Override

public ElasticSearchPage getIndex(String index, String type, QueryBuilder queryBuilder, int pageNo, int pageSize) {

ElasticSearchPage result = new ElasticSearchPage();

try {

SearchRequestBuilder searchRequestBuilder = getTransportClient.prepareSearch(index).setTypes(type);

if (null != queryBuilder) {

searchRequestBuilder.setQuery(queryBuilder);

}

SearchResponse searchResponse = searchRequestBuilder.setFrom((pageNo - 1) * pageSize).setSize(pageSize).setExplain(true).execute().actionGet();

result = new ElasticSearchPage(searchResponse.getHits(), pageNo, pageSize);

} catch (Exception e) {

throw new ApiElasticSearchException(“【分页查询索引】” + e.getMessage());

}

return result;

}

/**

* 通过queryBuilder+SortBuilder分页查询

*

* @param index

* @param type

* @param queryBuilder

* @param sortBuilderList

* @param pageNo

* @param pageSize

* @return

*/

@Override

public ElasticSearchPage getIndex(String index, String type, QueryBuilder queryBuilder, List<SortBuilder<?>> sortBuilderList, int pageNo, int pageSize) {

ElasticSearchPage result = new ElasticSearchPage();

try {

SearchRequestBuilder searchRequestBuilder = getTransportClient.prepareSearch(index).setTypes(type);

if (null != queryBuilder) {

searchRequestBuilder.setQuery(queryBuilder);

}

if (null != sortBuilderList) {

for (SortBuilder<?> sortBuilder : sortBuilderList) {

searchRequestBuilder.addSort(sortBuilder);

}

}

SearchResponse searchResponse = searchRequestBuilder.setFrom((pageNo - 1) * pageSize).setSize(pageSize).setExplain(true).execute().actionGet();

result = new ElasticSearchPage(searchResponse.getHits(), pageNo, pageSize);

} catch (Exception e) {

throw new ApiElasticSearchException(“【分页查询索引】” + e.getMessage());

}

return result;

}

/**

* 通过queryBuilder+SortBuilder+highlightBuilder分页查询

*

* @param index

* @param type

* @param queryBuilder

* @param sortBuilderList

* @param highlightBuilder

* @param pageNo

* @param pageSize

* @return

*/

@Override

public ElasticSearchPage getIndex(String index, String type, QueryBuilder queryBuilder, List<SortBuilder<?>> sortBuilderList, HighlightBuilder highlightBuilder, int pageNo, int pageSize) {

ElasticSearchPage result = new ElasticSearchPage();

try {

SearchRequestBuilder searchRequestBuilder = getTransportClient.prepareSearch(index).setTypes(type);

if (null != queryBuilder) {

searchRequestBuilder.setQuery(queryBuilder);

}

if (null != sortBuilderList) {

for (SortBuilder<?> sortBuilder : sortBuilderList) {

searchRequestBuilder.addSort(sortBuilder);

}

}

if (null != highlightBuilder) {

searchRequestBuilder.highlighter(highlightBuilder);

}

SearchResponse searchResponse = searchRequestBuilder.setFrom((pageNo - 1) * pageSize).setSize(pageSize).setExplain(true).execute().actionGet();

result = new ElasticSearchPage(searchResponse.getHits(), pageNo, pageSize);

// 处理高亮

result.setList(ElasticSearchUtil.handleHighlight(searchResponse.getHits()));

} catch (Exception e) {

throw new ApiElasticSearchException(“【分页查询索引】” + e.getMessage());

}

return result;

}

/**

* 通过queryBuilder+SortBuilder+highlightBuilder+AggregationBuilder分页查询

*

* @param index

* @param type

* @param queryBuilder

* @param sortBuilderList

* @param highlightBuilder

* @param aggregationBuilderList

* @param pageNo

* @param pageSize

* @return

*/

@Override

public ElasticSearchPage getIndex(String index, String type, QueryBuilder queryBuilder, List<SortBuilder<?>> sortBuilderList, HighlightBuilder highlightBuilder, List aggregationBuilderList, int pageNo, int pageSize) {

ElasticSearchPage result = new ElasticSearchPage();

try {

SearchRequestBuilder searchRequestBuilder = getTransportClient.prepareSearch(index).setTypes(type);

if (null != queryBuilder) {

searchRequestBuilder.setQuery(queryBuilder);

}

if (null != sortBuilderList) {

for (SortBuilder<?> sortBuilder : sortBuilderList) {

searchRequestBuilder.addSort(sortBuilder);

}

}

if (null != highlightBuilder) {

searchRequestBuilder.highlighter(highlightBuilder);

}

if (null != aggregationBuilderList) {

for (AggregationBuilder aggregationBuilder : aggregationBuilderList) {

searchRequestBuilder.addAggregation(aggregationBuilder);

}

}

SearchResponse searchResponse = searchRequestBuilder.setFrom((pageNo - 1) * pageSize).setSize(pageSize).setExplain(true).execute().actionGet();

result = new ElasticSearchPage(searchResponse.getHits(), pageNo, pageSize);

// 处理高亮

result.setList(ElasticSearchUtil.handleHighlight(searchResponse.getHits()));

// 处理聚合

result.setAggregation(ElasticSearchUtil.handleAggregations(searchResponse.getAggregations()));

} catch (Exception e) {

throw new ApiElasticSearchException(“【分页查询索引】” + e.getMessage());

}

return result;

}

@Override

public boolean createIndex(String index, String type, String id, T vo){

synchronized (obj) {

try {

XContentBuilder xContentBuilder = jsonBuilder();

if (null != vo) {

xContentBuilder = ElasticSearchUtil.ObjectToJXContentBuilder(xContentBuilder, vo);

}

IndexRequestBuilder indexRequestBuilder = getTransportClient.prepareIndex(index, type, id).setSource(xContentBuilder);

IndexResponse indexResponse = indexRequestBuilder.get();

if (Constants.ELASTICSEARCH_SUCCESS.equals(indexResponse.status())) {

return true;

}

} catch (Exception e) {

throw new ApiElasticSearchException(“【创建索引】创建索引失败,失败原因:”+e.getMessage());

}

return true;

}

}

@Override

public boolean createIndex(String index, String type, List ids, List<? extends T> list) {

synchronized (obj) {

try {

if (null != ids && null != list && ids.size() == list.size()) {

BulkRequestBuilder bulkRequestBuilder = getTransportClient.prepareBulk();

for (int i = 0; i < ids.size(); i++) {

XContentBuilder xContentBuilder = ElasticSearchUtil.ObjectToJXContentBuilder(jsonBuilder(), list.get(i));

IndexRequestBuilder indexRequestBuilder = getTransportClient.prepareIndex(index, type, ids.get(i)).setSource(xContentBuilder);

bulkRequestBuilder.add(indexRequestBuilder);

}

BulkResponse bulkResponse = bulkRequestBuilder.execute().actionGet();

if (bulkResponse.hasFailures()) {

throw new ApiElasticSearchException(“【批量创建索引】量创建索引失败,失败原因:” + bulkResponse.buildFailureMessage());

} else {

if (Constants.ELASTICSEARCH_SUCCESS.equals(bulkResponse.status())) {

return true;

}

}

} else {

throw new ApiElasticSearchException(“【批量创建索引】创建索引失败,createIndex传入的ids与list参数必须对应一致。”);

}

} catch (Exception e) {

throw new ApiElasticSearchException(“【批量创建索引】量创建索引失败,失败原因:” + e.getMessage());

}

return false;

}

}

@Override

public boolean modifyIndex(String index, String type, String id, T vo) {

synchronized (obj) {

try {

XContentBuilder xContentBuilder = jsonBuilder();

if (null != vo) {

xContentBuilder = ElasticSearchUtil.ObjectToJXContentBuilder(xContentBuilder, vo);

}

UpdateRequestBuilder updateRequestBuilder = getTransportClient.prepareUpdate(index, type, id).setDoc(xContentBuilder);

UpdateResponse updateResponse = updateRequestBuilder.execute().actionGet();

if (Constants.ELASTICSEARCH_SUCCESS.equals(updateResponse.status())) {

return true;

}

} catch (Exception e) {

throw new ApiElasticSearchException(“【更新索引】更新索引失败,失败原因:” + e.getMessage());

}

return false;

}

}

@Override

public boolean modifyIndex(String index, String type, List ids, List<? extends T> list) {

synchronized (obj) {

try {

if (null != ids && null != list && ids.size() == list.size()) {

BulkRequestBuilder bulkRequestBuilder = getTransportClient.prepareBulk();

for (int i = 0; i < ids.size(); i++) {

XContentBuilder xContentBuilder = xContentBuilder = ElasticSearchUtil.ObjectToJXContentBuilder(jsonBuilder(), list.get(i));

UpdateRequestBuilder updateRequestBuilder = getTransportClient.prepareUpdate(index, type, ids.get(i)).setDoc(xContentBuilder);

bulkRequestBuilder.add(updateRequestBuilder);

}

BulkResponse bulkResponse = bulkRequestBuilder.execute().actionGet();

if (bulkResponse.hasFailures()) {

throw new ApiElasticSearchException(“【批量更新索引】批量创建索引失败,失败原因::” + bulkResponse.buildFailureMessage());

} else {

if (Constants.ELASTICSEARCH_SUCCESS.equals(bulkResponse.status())) {

return true;

}

}

} else {

throw new ApiElasticSearchException(“【批量更新索引】更新索引失败,updateIndex传入的ids与list参数必须对应一致。”);

}

} catch (Exception e) {

throw new ApiElasticSearchException(“【批量更新索引】” + e.getMessage());

}

return false;

}

}

@Override

public boolean removeIndex(String index, String type, String id) {

synchronized (obj) {

try {

DeleteRequestBuilder deleteRequestBuilder = getTransportClient.prepareDelete(index, type, id);

DeleteResponse deleteResponse = deleteRequestBuilder.execute().actionGet();

if (Constants.ELASTICSEARCH_SUCCESS.equals(deleteResponse.status())) {

return true;

}

} catch (Exception e) {

throw new ApiElasticSearchException(“【删除索引】” + e.getMessage());

}

return false;

}

}

@Override

public boolean removeIndex(String index, String type, List ids) {

synchronized (obj) {

try {

BulkRequestBuilder bulkRequestBuilder = getTransportClient.prepareBulk();

if (null != ids) {

for (String id : ids) {

DeleteRequestBuilder deleteRequestBuilder = getTransportClient.prepareDelete(index, type, id);

bulkRequestBuilder.add(deleteRequestBuilder);

}

}

BulkResponse bulkResponse = bulkRequestBuilder.execute().actionGet();

if (bulkResponse.hasFailures()) {

throw new ApiElasticSearchException(“【批量删除索引失败,失败原因:】” + bulkResponse.buildFailureMessage());

} else {

if (Constants.ELASTICSEARCH_SUCCESS.equals(bulkResponse.status())) {

return true;

}

}

} catch (Exception e) {

throw new ApiElasticSearchException(“【批量删除索引】” + e.getMessage());

}

return false;

}

}

}

从代码里面,大家也可以看出泛型的作用是什么,这边我们统一抛出自定义api错误,将异常进行转型处理。还有最重要的一点是,我们在添加,修改,删除索引的时候采用了锁,这样就可以保证在并发情况下,不会造成数据错误。

3.上面可以很明显的看到,我们通过工具类来处理高亮和聚合,所有这边也给大家介绍一下工具类里面的实现,如下所示:

package com.infun.platform.es.util;

import com.alibaba.fastjson.JSON;

import com.alibaba.fastjson.JSONArray;

import com.alibaba.fastjson.JSONObject;

import com.infun.platform.es.constant.ElasticsearchConstant;

import com.infun.platform.model.entity.EsConfig;

import org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder;

import org.elasticsearch.client.transport.TransportClient;

import org.elasticsearch.common.text.Text;

import org.elasticsearch.common.xcontent.XContentBuilder;

import org.elasticsearch.common.xcontent.XContentFactory;

import org.elasticsearch.search.SearchHit;

import org.elasticsearch.search.SearchHits;

import org.elasticsearch.search.aggregations.Aggregation;

import org.elasticsearch.search.aggregations.Aggregations;

import org.elasticsearch.search.aggregations.bucket.range.Range;

import org.elasticsearch.search.aggregations.bucket.terms.Terms;

import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;

import org.elasticsearch.search.sort.SortBuilder;

import org.elasticsearch.search.sort.SortBuilders;

import org.elasticsearch.search.sort.SortOrder;

import java.io.IOException;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

/**

* ElasticSearch工具类

* @author linzhiqiang

*/

public class ElasticSearchUtil {

/**

* ES桶聚合数目(默认是10条,设为1000条)

*/

public final static int ES_BUCKETS_NUMBER = 1000;

/**

* 处理高亮

*

* @param searchHits

* @return

*/

public static JSONArray handleHighlight(SearchHits searchHits) {

JSONArray result = new JSONArray();

if (null != searchHits) {

for (SearchHit searchHit : searchHits) {

Map<String, Object> source = searchHit.getSourceAsMap();

// 获取高亮

Map<String, HighlightField> highlightMap = searchHit.getHighlightFields();

for (String key : highlightMap.keySet()) {

for (Text text : highlightMap.get(key).getFragments()) {

// 高亮字段,如name的高亮字段为nameHighlight

source.put(key + “Highlight”, text.toString());

}

}

result.add(JSONObject.parseObject(JSON.toJSONString(source)));

}

}

return result;

}

/**

* 处理聚合

*

* @param aggregations

* @return

*/

public static JSONObject handleAggregations(Aggregations aggregations) {

JSONObject result = new JSONObject();

if (null != aggregations) {

Map<String, Aggregation> aggregationMap = aggregations.asMap();

for (String aggregationKey : aggregationMap.keySet()) {

// 遍历聚合字段

Aggregation aggregation = aggregations.get(aggregationKey);

if (aggregation instanceof Terms) {

// term聚合

Terms terms = (Terms) aggregation;

if (null != terms && null != terms.getBuckets()) {

JSONArray bucketJsonArray = new JSONArray();

for (Terms.Bucket bucket : terms.getBuckets()) {

// 封装组合字段

JSONObject bucketJsonObject = new JSONObject();

bucketJsonObject.put(“key”, bucket.getKey());

bucketJsonObject.put(“docCount”, bucket.getDocCount());

bucketJsonArray.add(bucketJsonObject);

}

result.put(aggregationKey, bucketJsonArray);

} else {

result.put(aggregationKey, new JSONArray());

}

} else if (aggregation instanceof Range) {

// range、daterange聚合

Range range = (Range) aggregation;

if (null != range && null != range.getBuckets()) {

JSONArray bucketJsonArray = new JSONArray();

for (Range.Bucket bucket : range.getBuckets()) {

// 封装组合字段

JSONObject bucketJsonObject = new JSONObject();

bucketJsonObject.put(“key”, bucket.getKey());

bucketJsonObject.put(“docCount”, bucket.getDocCount());

bucketJsonObject.put(“from”, bucket.getFrom());

bucketJsonObject.put(“to”, bucket.getTo());

bucketJsonArray.add(bucketJsonObject);

}

result.put(aggregationKey, bucketJsonArray);

} else {

result.put(aggregationKey, new JSONArray());

}

}

}

}

return result;

}

/**

* 数据类型处理

* @param xContentBuilder

* @param object

* @return

* @throws IOException

*/

public static XContentBuilder ObjectToJXContentBuilder(XContentBuilder xContentBuilder, Object object) throws IOException {

// 数据类型格式处理

JSONObject jsonObject = JSONObject.parseObject(JSON.toJSONString(object));

// 判断是否为null

if (!jsonObject.isEmpty()) {

xContentBuilder.startObject();

for (Object keyObject : jsonObject.keySet()) {

// 设置值到content中

xContentBuilder.field(keyObject.toString(), jsonObject.get(keyObject));

}

xContentBuilder.endObject();

}

return xContentBuilder;

}

/**

* 创建索引与mapping模板

*

* @param index 索引字段

* @param type 类型

* @param client 客户端

* @throws IOException

*/

public static void createMapping(String index, String type, TransportClient client) throws IOException {

CreateIndexRequestBuilder cib = client.admin()

.indices().prepareCreate(index);

XContentBuilder mapping = XContentFactory.jsonBuilder()

.startObject()

.startObject(“properties”)

.startObject(“id”)

.field(“type”, “long”)

.field(“store”, “yes”)

.endObject()

总结

阿里伤透我心,疯狂复习刷题,终于喜提offer 哈哈~好啦,不闲扯了

image

1、JAVA面试核心知识整理(PDF):包含JVMJAVA集合JAVA多线程并发,JAVA基础,Spring原理微服务,Netty与RPC,网络,日志,ZookeeperKafkaRabbitMQ,Hbase,MongoDB,Cassandra,设计模式负载均衡数据库一致性哈希JAVA算法数据结构,加密算法,分布式缓存,Hadoop,Spark,Storm,YARN,机器学习,云计算共30个章节。

image

2、Redis学习笔记及学习思维脑图

image

3、数据面试必备20题+数据库性能优化的21个最佳实践

image
*

* 创建索引与mapping模板

*

* @param index 索引字段

* @param type 类型

* @param client 客户端

* @throws IOException

*/

public static void createMapping(String index, String type, TransportClient client) throws IOException {

CreateIndexRequestBuilder cib = client.admin()

.indices().prepareCreate(index);

XContentBuilder mapping = XContentFactory.jsonBuilder()

.startObject()

.startObject(“properties”)

.startObject(“id”)

.field(“type”, “long”)

.field(“store”, “yes”)

.endObject()

总结

阿里伤透我心,疯狂复习刷题,终于喜提offer 哈哈~好啦,不闲扯了

[外链图片转存中…(img-PQLboKRj-1719155865501)]

1、JAVA面试核心知识整理(PDF):包含JVMJAVA集合JAVA多线程并发,JAVA基础,Spring原理微服务,Netty与RPC,网络,日志,ZookeeperKafkaRabbitMQ,Hbase,MongoDB,Cassandra,设计模式负载均衡数据库一致性哈希JAVA算法数据结构,加密算法,分布式缓存,Hadoop,Spark,Storm,YARN,机器学习,云计算共30个章节。

[外链图片转存中…(img-C7Tynd2e-1719155865502)]

2、Redis学习笔记及学习思维脑图

[外链图片转存中…(img-x4FG9bqB-1719155865503)]

3、数据面试必备20题+数据库性能优化的21个最佳实践

[外链图片转存中…(img-WUyhwVQd-1719155865503)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值