栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

elasticsearch实践之代码结构设计,java银行项目面试题

elasticsearch实践之代码结构设计,java银行项目面试题

@Service

public class ElasticsearchServiceImpl implements ElasticsearchService {

private static final Object obj = new Object();

@Autowired

private TransportClient getTransportClient;

@Override

public ElasticSearchList getIndex(String index, String type, String id) {

ElasticSearchList result = new ElasticSearchList();

try {

JSonArray jsonArray = new JSonArray();

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

searchRequestBuilder.setQuery(QueryBuilders.idsQuery().addIds(id));

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

SearchHits searchHits = searchResponse.getHits();

for (SearchHit searchHit : searchHits) {

Map source = searchHit.getSourceAsMap();

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

}

JSonObject jsonObject = ElasticSearchUtil.handleAggregations(searchResponse.getAggregations());

result.setList(jsonArray);

result.setAggregation(jsonObject);

} catch (Exception e) {

throw new ApiElasticSearchException("【查询索引异常】查询索引异常,失败原因:" + e.getMessage());

}

return result;

}

@Override

public ElasticSearchList getIndex(String index, String type, QueryBuilder queryBuilder) {

ElasticSearchList result = new ElasticSearchList();

try {

JSonArray jsonArray = new JSonArray();

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

if (null != queryBuilder) {

searchRequestBuilder.setQuery(queryBuilder);

}

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

SearchHits searchHits = searchResponse.getHits();

for (SearchHit searchHit : searchHits) {

Map source = searchHit.getSourceAsMap();

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

}

result.setList(jsonArray);

} catch (Exception e) {

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

}

return result;

}

@Override

public ElasticSearchList getIndex(String index, String type, QueryBuilder queryBuilder, List> sortBuilderList) {

ElasticSearchList result = new ElasticSearchList();

try {

JSonArray jsonArray = new JSonArray();

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.setExplain(true).execute().actionGet();

SearchHits searchHits = searchResponse.getHits();

for (SearchHit searchHit : searchHits) {

Map source = searchHit.getSourceAsMap();

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

}

result.setList(jsonArray);

} catch (Exception e) {

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

}

return result;

}

@Override

public ElasticSearchList getIndex(String index, String type, QueryBuilder queryBuilder, List> 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;

}

@Override

public ElasticSearchList getIndex(String index, String type, QueryBuilder queryBuilder, List> 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;

}

@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;

}

@Override

public ElasticSearchPage getIndex(String index, String type, QueryBuilder queryBuilder, List> 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;

}

@Override

public ElasticSearchPage getIndex(String index, String type, QueryBuilder queryBuilder, List> 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;

}

@Override

public ElasticSearchPage getIndex(String index, String type, QueryBuilder queryBuilder, List> 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 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 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;

public class ElasticSearchUtil {

public final static int ES_BUCKETS_NUMBER = 1000;

public static JSonArray handleHighlight(SearchHits searchHits) {

JSonArray result = new JSonArray();

if (null != searchHits) {

for (SearchHit searchHit : searchHits) {

Map source = searchHit.getSourceAsMap();

// 获取高亮

Map 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;

}

public static JSonObject handleAggregations(Aggregations aggregations) {

JSonObject result = new JSonObject();

if (null != aggregations) {

Map 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;

}

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/673452.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号