ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

elasticsearch用于java开发实战api

2021-02-24 17:04:19  阅读:119  来源: 互联网

标签:index java String client api elasticsearch import org public


java开发使用es实战,比较枯燥,新手可以新建个spring boot项目学习一下

先简单了解一下es服务,理解成我们的mysql数据库表

在阿里购买一台es服务,并且登录kibana进入可视化es服务操作界面,并且创建一个es索引表名v_test_order,如下图:
在这里插入图片描述可以看到,es创建一个索引表,和我们常见的数据很像,有表名,有表结构,每个字段还有对应的类型
创建好了之后,我们需要插入几条数据并查看,如下图:
在这里插入图片描述

下面就开始讲讲java代码配置到使用:增、删、查

pom文件引用:

		<dependency>
			<groupId>org.elasticsearch.client</groupId>
			<artifactId>elasticsearch-rest-client</artifactId>
			<version>6.3.2</version>
		</dependency>

		<dependency>
			<groupId>org.elasticsearch.client</groupId>
			<artifactId>elasticsearch-rest-high-level-client</artifactId>
			<version>6.3.2</version>
			<exclusions>
				<exclusion>
					<groupId>org.elasticsearch</groupId>
					<artifactId>elasticsearch</artifactId>
				</exclusion>
			</exclusions>
		</dependency>

es服务配置类:


import java.net.UnknownHostException;

import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.config.RequestConfig.Builder;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * ES配置
 * @author 00wnagfan00
 * @date 2021/02/24
 */

@Configuration
@ConditionalOnProperty(name="ykc.elastic.prop.enabled",havingValue="true")
@EnableConfigurationProperties(ElasticProperties.class)
@ConditionalOnClass(RestClientBuilder.class)
public class ElasticConfiguration {

	
	@Autowired
	private ElasticProperties elasticProperties;
	
	@Bean
	@ConditionalOnMissingBean(RestHighLevelClient.class)
    public RestHighLevelClient restHighLevelClient() throws UnknownHostException {

		CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
		credentialsProvider.setCredentials(AuthScope.ANY,
		        new UsernamePasswordCredentials(elasticProperties.getUserName(),elasticProperties.getPassword()));
		
		RestClientBuilder builder = RestClient.builder(new HttpHost(elasticProperties.getHostUrl(), elasticProperties.getPort()))
		        .setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
		            @Override
		            public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
		                return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
		            }
		        })
		        .setRequestConfigCallback(new RestClientBuilder.RequestConfigCallback() {
					@Override
					public Builder customizeRequestConfig(Builder requestConfigBuilder) {
					
						return requestConfigBuilder.setConnectTimeout(elasticProperties.getConnectTimeout()).setSocketTimeout(elasticProperties.getSocketTimeout());
					}
		        	
		        }).setMaxRetryTimeoutMillis(elasticProperties.getMaxRetryTimeout());
		
        return new RestHighLevelClient(builder);

    }
}


import org.springframework.boot.context.properties.ConfigurationProperties;

/**
 * ES配置文件
 * @author 00wangfan00
 * @date 2021/02/24
 */
@ConfigurationProperties("ykc.elastic.prop")
public class ElasticProperties {

	/**
	  * 用户名
	 */
	private String userName = "elastic";
	
	/**
	 * 密码
	 */
	private String password;
	
	/**
	 * 主机地址
	 */
	private String hostUrl;
	
	/**
	 * 端口
	 */
	private int port = 9200;
	
	/**
	 * 建立连接超时时长
	 */
	private int connectTimeout = 5 * 1000;
	
	/**
	 * 连接超时时长
	 */
	private int socketTimeout = 60 * 1000;
	
	/**
	 * 最大重试时长
	 */
	
	private int maxRetryTimeout = 60 * 1000;

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getHostUrl() {
		return hostUrl;
	}

	public void setHostUrl(String hostUrl) {
		this.hostUrl = hostUrl;
	}

	public int getPort() {
		return port;
	}

	public void setPort(int port) {
		this.port = port;
	}

	public int getConnectTimeout() {
		return connectTimeout;
	}

	public void setConnectTimeout(int connectTimeout) {
		this.connectTimeout = connectTimeout;
	}

	public int getSocketTimeout() {
		return socketTimeout;
	}

	public void setSocketTimeout(int socketTimeout) {
		this.socketTimeout = socketTimeout;
	}

	public int getMaxRetryTimeout() {
		return maxRetryTimeout;
	}

	public void setMaxRetryTimeout(int maxRetryTimeout) {
		this.maxRetryTimeout = maxRetryTimeout;
	}
	
}

这里我们先来说一下java代码的新增和删除,为什么没有修改,因为新增会覆盖,所以只需要做新增就行了

分享一个ElasticsearchUtil

import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.ykc.es.entity.BuryingPoint;
import com.ykc.es.entity.ResponseAllModel;
import com.ykc.service.RedisService;
import org.apache.http.Header;
import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.client.Response;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.mortbay.util.ajax.JSON;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @Title: ElasticsearchUtil
 * @Description: 工具类
 * @author chy
 * @date 2018/4/24 15:40
 */
@Component
public class ElasticsearchUtil {
    private static final Logger LOGGER = LoggerFactory.getLogger(ElasticsearchUtil.class);

    @Resource(name="restHighLevelClient")
    private RestHighLevelClient restHighLevelClient;

    private static RestHighLevelClient client;

    private static ObjectMapper mapper = new ObjectMapper();

    /**
     * @PostContruct是spring框架的注解
     * spring容器初始化的时候执行该方法
     */
    @PostConstruct
    public void init() {
        client = this.restHighLevelClient;
    }

    /**
     * 创建索引
     *
     * @param index
     * @return
     */
    public static boolean createIndex(String index) {
        //index名必须全小写,否则报错
        CreateIndexRequest request = new CreateIndexRequest(index);
        try {
            CreateIndexResponse indexResponse = client.indices().create(request);
            if (indexResponse.isAcknowledged()) {
                LOGGER.info("创建索引成功");
            } else {
                LOGGER.info("创建索引失败");
            }
            return indexResponse.isAcknowledged();
        } catch (IOException e) {
            LOGGER.error("context", e);
        }

        return false;
    }

    /**
     * 插入数据
     * @param index
     * @param type
     * @param object
     * @return
     */
    public static String addData(String index,String type,String id,JSONObject object) {
        IndexRequest indexRequest = new IndexRequest(index, type, id);
        try {
            indexRequest.source(mapper.writeValueAsString(object), XContentType.JSON);
            IndexResponse indexResponse = client.index(indexRequest);
            return indexResponse.getId();
        } catch (Exception e) {
            LOGGER.error("插入数据失败:"+ JSON.toString(object)+"失败原因:"+e.getMessage());
        }
        return null;
    }

    /**
     * 历史订单批量插入
     * @param index
     * @param type
     */
    public static void addOrderDataList(String index,String type,List<JSONObject> jsonObjects) {
        BulkRequest bulkRequest = new BulkRequest();
        try {
            for (JSONObject paramObject : jsonObjects) {
                IndexRequest indexRequest = new IndexRequest(index, type, paramObject.getString("indexField"));
                JSONObject object =JSONObject.parseObject(com.alibaba.fastjson.JSON.toJSONString(paramObject));
                indexRequest.source(mapper.writeValueAsString(object), XContentType.JSON);
                bulkRequest.add(indexRequest);
            }
            client.bulk(bulkRequest);//批量插入
        } catch (Exception e) {
            LOGGER.error("插入数据失败,失败原因:"+e.getMessage());
        }

    }

    /**
     * 埋点批量插入
     * @param index
     * @param type
     * @param buryingPointList
     * @param redisTemplate
     */
    public static void addDataList(String index,String type,List<BuryingPoint> buryingPointList,RedisTemplate redisTemplate, ResponseAllModel responseModel) {
        BulkRequest bulkRequest = new BulkRequest();
        try {
            for (BuryingPoint buryingPoint : buryingPointList) {
                String id = RedisService.genSeqCode(redisTemplate, "burying_point_id_", 10);
                IndexRequest indexRequest = new IndexRequest(index, type, id);
                JSONObject object =JSONObject.parseObject(com.alibaba.fastjson.JSON.toJSONString(buryingPoint));
                indexRequest.source(mapper.writeValueAsString(object), XContentType.JSON);
                bulkRequest.add(indexRequest);
            }
            client.bulk(bulkRequest);//批量插入
            responseModel.setResultCode("0");
            responseModel.setResultMsg("");
        } catch (Exception e) {
            LOGGER.error("插入数据失败,失败原因:"+e.getMessage());
            responseModel.setResultCode("1");
            responseModel.setResultMsg("插入数据失败,失败原因:"+e.getMessage());
        }

    }

    /**
     * 功能描述:更新数据
     * @param index 索引名
     * @param type  类型
     * @param _id   数据id
     * @param json  数据
     */
    @SuppressWarnings("deprecation")
    public static void updateData(String index, String type, String _id, JSONObject json){
        try {
            UpdateRequest updateRequest = new UpdateRequest(index, type, _id).doc(json);
            client.update(updateRequest);
        } catch (Exception e) {
            LOGGER.error("context", e);
        }
    }

    /**
     * 功能描述:删除指定数据
     * @param index 索引名
     * @param type  类型
     * @param _id   数据id
     */
    public static void deleteData(String index, String type, String _id) {
        try {
            DeleteRequest response = new DeleteRequest(index, type, _id);
            client.delete(response);
        } catch (Exception e) {
            LOGGER.error("context", e);
        }
    }

    /**
     * 通过索引id检查是否存在
     */
    public static boolean isExistsId(String index, String type, String id) {
        boolean bool = false;
        GetRequest getRequest = new GetRequest(index, type, id);
        try {
            GetResponse response =  client.get(getRequest);
            bool = response.isExists();
        } catch (IOException e) {
            LOGGER.error("context", e);
        }
        return bool;
    }


    /**
     * 检查索引
     * @param index
     * @return
     * @throws IOException
     */
    public static boolean checkIndexExist(String index) {
        try {
            Response response = client.getLowLevelClient().performRequest("HEAD", index);
            boolean exist = response.getStatusLine().getReasonPhrase().equals("OK");
            return exist;
        } catch (IOException e) {
            LOGGER.error("context", e);
        }
        return false;
    }


    /**
     * 获取低水平客户端
     * @return
     */
    public static RestClient getLowLevelClient() {
        return client.getLowLevelClient();
    }

}

这里是新增和删除方法,新增把内容写成JSONObject 对象

		JSONObject object = new JSONObject();
		String result = ElasticsearchUtil.addData("v_test_order","v_test_order","1",object);//新增
		ElasticsearchUtil.deleteData("v_test_order", "v_test_order",1);//删除

下面说说最重要的查询方法,使用的是 RestHighLevelClient :

        //1.创建索引SearchRequest
        SearchRequest searchRequest = new SearchRequest("这里就是indices,es上创建好的索引名");
        //2.处理所有条件到sourceBuilder
        SearchSourceBuilder sourceBuilder = dealAllQuery(requestModel);
        searchRequest.source(sourceBuilder);
        SearchResponse searchResponse = null;
        try {
            //3.请求ES
            searchResponse = restHighLevelClient.search(searchRequest);
        } catch (IOException e) {
            log.error("context", e);
        }

查询条件,针对不同条件进行过滤

  private SearchSourceBuilder dealAllQuery( int totalCount,RequestOrderModel requestModel) {
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
        //查询条件--->精确查询(满足数字和字符串)
        Map<String, Object> paramMap = (Map<String, Object>) requestModel.getParamData().getMustQuery();
        if(null!=paramMap){
            for (String sKey : paramMap.keySet()) {
                TermsQueryBuilder termQueryBuilder = QueryBuilders.termsQuery(sKey, (List)paramMap.get(sKey));
                boolQueryBuilder.must().add(termQueryBuilder);
            }
        }

        //查询条件--->模糊查询
        Map<String, Object> liparamMap = (Map<String, Object>) requestModel.getParamData().getPrefixQuery();
        if(null != liparamMap) {
            StringBuilder sb;
            for (String sKey : liparamMap.keySet()) {
                List<String> filteredParams = CharUtil.filterChinese(String.valueOf(liparamMap.get(sKey)).toLowerCase());//中文处理成分片查询
                for (int i = 0; i < filteredParams.size(); i++) {
                    MultiTermQueryBuilder queryBuilder;
                    if (i == filteredParams.size() - 1) {//最后一个条件用模糊查询
                        sb = new StringBuilder("*");
                        queryBuilder = QueryBuilders.wildcardQuery(sKey, sb.append(filteredParams.get(i)).append("*").toString());
                    } else {
                        queryBuilder = QueryBuilders.prefixQuery(sKey, filteredParams.get(i).toString());
                    }
                    boolQueryBuilder.must().add(queryBuilder);
                }
            }
        }

        //查询条件--->字段空值
        List<String> existsParam =  requestModel.getParamData().getExistsQuery();
        if(null != existsParam){
            for (String str : existsParam) {
                ExistsQueryBuilder existsQueryBuilder = QueryBuilders.existsQuery(str);
                boolQueryBuilder.must().add(existsQueryBuilder);
            }
        }

        //查询条件--->字段不为空值
        List<String> notExistsParam =  requestModel.getParamData().getNotExistsQuery();
        if(null != notExistsParam) {
            for (String str : notExistsParam) {
                ExistsQueryBuilder existsQueryBuilder = QueryBuilders.existsQuery(str);
                boolQueryBuilder.mustNot().add(existsQueryBuilder);
            }
        }

        //查询条件--->区间查询条件
        List<RangeQuery> rangeQueryList = requestModel.getParamData().getRangeQuery();
        if(null != rangeQueryList) {
            for (RangeQuery rangeQuery : rangeQueryList) {
                RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery(rangeQuery.getFieldName());
                rangeQueryBuilder.gte(rangeQuery.getMinfieldValue());
                rangeQueryBuilder.lte(rangeQuery.getMaxfieldValue());
                boolQueryBuilder.must().add(rangeQueryBuilder);
            }
        }

        //查询条件--->日期范围查询
        List<RangeQuery> rangeDateQueryList = requestModel.getParamData().getRangeDateQuery();
        if(null != rangeDateQueryList) {
            for (RangeQuery rangeQuery : rangeDateQueryList) {
                RangeQueryBuilder rangeDateQueryBuilder = QueryBuilders.rangeQuery(rangeQuery.getFieldName()+".keyword");
                rangeDateQueryBuilder.from(rangeQuery.getMinfieldValue()).to(rangeQuery.getMaxfieldValue());
                boolQueryBuilder.must().add(rangeDateQueryBuilder);
            }
        }

        //拼接所有条件
        sourceBuilder.query(boolQueryBuilder);

        //指定字段输出includefields包含,excludefields不包含
        String[] excludefields = {};
        if(null != requestModel.getIncludeFields()){
            sourceBuilder.fetchSource(requestModel.getIncludeFields(), excludefields);
        }


        if( requestModel.getPageSize()>0  && requestModel.getCurrPage()>0 ){
            sourceBuilder.from((requestModel.getCurrPage()-1)*requestModel.getPageSize());
            sourceBuilder.size(requestModel.getPageSize());
        }else{
            sourceBuilder.from(0);
            sourceBuilder.size(totalCount);
        }

        //排序
        if(null != requestModel.getSortName()) {
            String[] arr = requestModel.getSortName().split(",");
            for (String sortName : arr) {
                if(sortName.contains("_time")){
                    sourceBuilder.sort(sortName+".keyword", requestModel.getSortOrder().equals("0") ? SortOrder.ASC : SortOrder.DESC);
                }else{
                    sourceBuilder.sort(sortName, requestModel.getSortOrder().equals("0") ? SortOrder.ASC : SortOrder.DESC);
                }
            }
        }
        return sourceBuilder;
    }

标签:index,java,String,client,api,elasticsearch,import,org,public
来源: https://blog.csdn.net/oowangfanoo/article/details/114026961

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有