Java集成ElasticSearch及配置类工具类整理

Java集成ElasticSearch及配置类工具类整理

前言:做一个有梦想的程序猿!

ES不同的版本API差异比较大,此处ES版本为:6.5.3
代码如下:

添加Maven依赖

<!-- ES -->
	  <dependency>
	      <groupId>org.elasticsearch</groupId>
	      <artifactId>elasticsearch</artifactId>
	      <version>6.5.3</version>
	  </dependency>
	  
	  <dependency>
	      <groupId>org.elasticsearch.client</groupId>
	      <artifactId>transport</artifactId>
	      <version>6.5.3</version>
	 </dependency>
	 
	 <dependency>
	    <groupId>org.elasticsearch.client</groupId>
	    <artifactId>elasticsearch-rest-high-level-client</artifactId>
	    <version>6.5.3</version>
	 </dependency>

ES配置文件:elasticSearch.properties

host=192.168.43.214
port=9200
schema=http
connectNum=50
connectPerRoute=10

ES配置Bean:ESConfig .java

package com.org.util;

import org.apache.http.HttpHost;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

/**
 * 使用javaconfig 配置ES基础配置 
 * 工厂启动自动创建相关Bean
 * @author jqx
 *
 */
@Configuration
@ComponentScan(basePackageClasses=EsConfiguration.class)
public class ESConfig {

    @Value("${host}")
    private String host;

    @Value("${port}")
    private String port;

    @Value("${schema}")
    private String schema;

    @Value("${connectNum}")
    private String connectNum;

    @Value("${connectPerRoute}")
    private String connectPerRoute;


	public ESConfig(){
		System.out.println("ESConfig 初始化。。。。。。。。。。");
	}
    @Bean
    public HttpHost httpHost(){
    	System.out.println("port:  "+port+"   host:"+host+"    schema:"+schema);
        return new HttpHost(host,Integer.valueOf(port).intValue(),schema);
    }

    @Bean(initMethod="init",destroyMethod="close")
    public EsConfiguration getFactory(){
        return EsConfiguration.build(httpHost(), Integer.valueOf(connectNum), Integer.valueOf(connectPerRoute));
    }

   /* @Bean
    @Scope("singleton")
    public RestClient getRestClient(){
        return getFactory().getClient();
    }*/

    @Bean
    @Scope("singleton")
    public RestHighLevelClient getRHLClient(){
        return getFactory().getRhlClient();
    }
}


ES连接相关配置类:EsConfiguration.java

package com.org.util;
import java.io.IOException;

import org.apache.http.HttpHost;
import org.apache.http.client.config.RequestConfig.Builder;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestClientBuilder.HttpClientConfigCallback;
import org.elasticsearch.client.RestClientBuilder.RequestConfigCallback;
import org.elasticsearch.client.RestHighLevelClient;

/**
 * ES连接相关配置类
 * @author jqx
 *
 */
public class EsConfiguration {

    public static int CONNECT_TIMEOUT_MILLIS = 1000;
    public static int SOCKET_TIMEOUT_MILLIS = 30000;
    public static int CONNECTION_REQUEST_TIMEOUT_MILLIS = 500;
    public static int MAX_CONN_PER_ROUTE = 10;
    public static int MAX_CONN_TOTAL = 30;

    private static HttpHost HTTP_HOST;
    private RestClientBuilder builder;
    //private RestClient restClient;
    private RestHighLevelClient restHighLevelClient;

    private static EsConfiguration esClientSpringFactory = new EsConfiguration();

    private EsConfiguration(){}

    public static EsConfiguration build(HttpHost httpHost,Integer maxConnectNum, Integer maxConnectPerRoute){
        HTTP_HOST = httpHost;
        MAX_CONN_TOTAL = maxConnectNum;
        MAX_CONN_PER_ROUTE = maxConnectPerRoute;
        return  esClientSpringFactory;
    }

    public static EsConfiguration build(HttpHost httpHost,Integer connectTimeOut, Integer socketTimeOut,
            Integer connectionRequestTime,Integer maxConnectNum, Integer maxConnectPerRoute){
        HTTP_HOST = httpHost;
        CONNECT_TIMEOUT_MILLIS = connectTimeOut;
        SOCKET_TIMEOUT_MILLIS = socketTimeOut;
        CONNECTION_REQUEST_TIMEOUT_MILLIS = connectionRequestTime;
        MAX_CONN_TOTAL = maxConnectNum;
        MAX_CONN_PER_ROUTE = maxConnectPerRoute;
        return  esClientSpringFactory;
    }


    public void init(){
        builder = RestClient.builder(HTTP_HOST);
        setConnectTimeOutConfig();
        setMutiConnectConfig();
        //restClient = builder.build();
        restHighLevelClient = new RestHighLevelClient(builder);
        System.out.println("init factory");
    }
    // 配置连接时间延时
    public void setConnectTimeOutConfig(){
        builder.setRequestConfigCallback(new RequestConfigCallback() {

            @Override
            public Builder customizeRequestConfig(Builder requestConfigBuilder) {
                requestConfigBuilder.setConnectTimeout(CONNECT_TIMEOUT_MILLIS);
                requestConfigBuilder.setSocketTimeout(SOCKET_TIMEOUT_MILLIS);
                requestConfigBuilder.setConnectionRequestTimeout(CONNECTION_REQUEST_TIMEOUT_MILLIS);
                return requestConfigBuilder;
            }
        });
    }
    // 使用异步httpclient时设置并发连接数
    public void setMutiConnectConfig(){
        builder.setHttpClientConfigCallback(new HttpClientConfigCallback() {

            @Override
            public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
                httpClientBuilder.setMaxConnTotal(MAX_CONN_TOTAL);
                httpClientBuilder.setMaxConnPerRoute(MAX_CONN_PER_ROUTE);
                return httpClientBuilder;
            }
        });
    }

   /* public RestClient getClient(){
        return restClient;
    }*/

    public RestHighLevelClient getRhlClient(){
    	System.out.println("restHighLevelClient:    "+restHighLevelClient);
        return restHighLevelClient;
    }

    public void close() {
        if (restHighLevelClient != null) {
            try {
            	restHighLevelClient.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        System.out.println("close client");
    }

}

封装Es相关操作工具类:EsSearchSqlUtil.java 基本上包含了ES常用的API

package com.org.util;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.admin.indices.get.GetIndexRequest;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.action.support.IndicesOptions;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.FetchSourceContext;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * ES相关操作封装工具类
 * @author jqx
 *
 */
public class EsSearchSqlUtil {
	
	static Logger logger = Logger.getLogger(EsSearchSqlUtil.class);  
	
	@Autowired
	private RestHighLevelClient client;
	
	/**
     * 创建索引
     * @param index
     * @return
	 * @throws IOException 
     */
    public boolean createIndex(String index) throws IOException {
        if (!isIndexExist(index)) {
            logger.info("index is not exits!");
        }
        CreateIndexRequest request = new CreateIndexRequest(index);
        request.timeout(TimeValue.timeValueMinutes(2)); 
        request.masterNodeTimeout(TimeValue.timeValueMinutes(1)); 

        request.settings(Settings.builder().put("index.number_of_shards", 5).put("index.number_of_replicas", 1));
        
        //1、同步方法
        CreateIndexResponse indexresponse = client.indices().create(request, RequestOptions.DEFAULT);
       
        //2、异步方法不会阻塞并立即返回。
        /*ActionListener<CreateIndexResponse> listener = new ActionListener<CreateIndexResponse>() {
            @Override
            public void onResponse(CreateIndexResponse createIndexResponse) {
                //如果执行成功,则调用onResponse方法;
            }
            @Override
            public void onFailure(Exception e) {
                //如果失败,则调用onFailure方法。
            }
        };
        client.indices().createAsync(request, RequestOptions.DEFAULT, listener);*/

        logger.info("success to create index " + indexresponse.isAcknowledged());

        return indexresponse.isAcknowledged();
    }
    
    /**
     * 删除索引
     *
     * @param index
     * @return
     * @throws IOException 
     */
    public boolean deleteIndex(String index) throws IOException {
        if (!isIndexExist(index)) {
            logger.info("index is not exits!");
        }
        DeleteIndexRequest request = new DeleteIndexRequest(index); 
        request.timeout(TimeValue.timeValueMinutes(2)); 
        request.masterNodeTimeout(TimeValue.timeValueMinutes(1)); 
        
        //设置IndicesOptions去控制不能用的索引如何解决处理,下面用lenientExpandOpen进行通用的处理
        request.indicesOptions(IndicesOptions.lenientExpandOpen()); 
        
        //1、同步方法
        AcknowledgedResponse  dResponse = client.indices().delete(request,RequestOptions.DEFAULT);

        //2、异步方法不会阻塞并立即返回。
        /*ActionListener<AcknowledgedResponse> listener = new ActionListener<AcknowledgedResponse>() {

			@Override
			public void onFailure(Exception arg0) {
				// TODO Auto-generated method stub
			}

			@Override
			public void onResponse(AcknowledgedResponse arg0) {
				// TODO Auto-generated method stub
			}
           
        };
        client.indices().deleteAsync(request, RequestOptions.DEFAULT, listener);*/
        
        if (dResponse.isAcknowledged()) {
            logger.info("delete index " + index + "  successfully!");
        } else {
            logger.info("fail to delete index " + index);
        }
        return dResponse.isAcknowledged();
    }
    
    /**
     * 判断索引是否存在
     *
     * @param index
     * @return
     * @throws IOException 
     */
    public boolean isIndexExist(String index) throws IOException {
    	GetIndexRequest request = new GetIndexRequest();
    	request.indices(index);
		request.local(false);
		request.humanReadable(true);
    	boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
        if (exists) {
            logger.info("index [" + index + "] is exist!");
        } else {
            logger.info("index [" + index + "] is not exist!");
        }
        return exists;
    }
    
    /**
     * 通过ID获取数据
     *
     * @param index  索引,类似数据库
     * @param type   类型,类似表
     * @param id     数据ID
     * @param includFields 需要显示的字段,逗号分隔(缺省为全部字段)
     * @return
     * @throws IOException 
     */
    public Map<String, Object> searchDataById(String index, String type, String id, String includFields) throws IOException {
        GetRequest request = new GetRequest(index,type, id);
        
        if (StringUtils.isNotEmpty(includFields)) {
        	//不展示的字段
        	String[] excludeFields = new String[]{};
        	
        	//查询特定字段,包含和不包含的字段
            FetchSourceContext fetchSourceContext =new FetchSourceContext(true, includFields.split(","),excludeFields );
            request.fetchSourceContext(fetchSourceContext);
            
            //为特定的存储字段配置检索(要求字段在映射中单独存储)
            //request.storedFields(storeFields);
        }
        GetResponse response = client.get(request, RequestOptions.DEFAULT);
        return response.getSource();
    }

    /**
     * 使用分词查询
     *
     * @param index    索引名称
     * @param type     类型名称,可传入多个type逗号分隔
     * @param fields   需要显示的字段,逗号分隔(缺省为全部字段)
     * @param matchStr 过滤条件(xxx=111,aaa=222)
     * @return
     * @throws IOException 
     */
    public List<Map<String, Object>> searchListData(String index, String type, String fields, String matchStr) throws IOException {
        return searchListData(index, type, 0, 0, null, fields, null, false, null, matchStr);
    }

    /**
     * 使用分词查询
     *
     * @param index       索引名称
     * @param type        类型名称,可传入多个type逗号分隔
     * @param fields      需要显示的字段,逗号分隔(缺省为全部字段)
     * @param sortField   排序字段
     * @param matchPhrase true 使用,短语精准匹配
     * @param matchStr    过滤条件(xxx=111,aaa=222)
     * @return
     * @throws IOException 
     */
    public List<Map<String, Object>> searchListData(String index, String type, String fields, String sortField, boolean matchPhrase, String matchStr) throws IOException {
        return searchListData(index, type, 0, 0, null, fields, sortField, matchPhrase, null, matchStr);
    }


    /**
     * 使用分词查询
     *
     * @param index          索引名称
     * @param type           类型名称,可传入多个type逗号分隔
     * @param size           文档大小限制
     * @param fields         需要显示的字段,逗号分隔(缺省为全部字段)
     * @param sortField      排序字段
     * @param matchPhrase    true 使用,短语精准匹配
     * @param highlightField 高亮字段
     * @param matchStr       过滤条件(xxx=111,aaa=222)
     * @return
     * @throws IOException 
     */
    public List<Map<String, Object>> searchListData(String index, String type, Integer size, String fields, String sortField, boolean matchPhrase, String highlightField, String matchStr) throws IOException {
        return searchListData(index, type, 0, 0, size, fields, sortField, matchPhrase, highlightField, matchStr);
    }


    /**
     * 使用分词查询
     *
     * @param index          索引名称
     * @param type           类型名称,可传入多个type逗号分隔
     * @param startTime      开始时间
     * @param endTime        结束时间
     * @param size           文档大小限制
     * @param fields         需要显示的字段,逗号分隔(缺省为全部字段)
     * @param sortField      排序字段
     * @param matchPhrase    true 使用,短语精准匹配
     * @param highlightField 高亮字段
     * @param matchStr       过滤条件(xxx=111,aaa=222)
     * @return
     * @throws IOException 
     */
    public List<Map<String, Object>> searchListData(String index, String type, long startTime, long endTime, Integer size, String fields, String sortField, boolean matchPhrase, String highlightField, String matchStr) throws IOException {
        SearchRequest  request = new SearchRequest (index);
        SearchSourceBuilder searchRequestBuilder = new SearchSourceBuilder();
        if (StringUtils.isNotEmpty(type)) {
        	request.types(type.split(","));
        }
        
        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
        
        if (startTime > 0 && endTime > 0) {
            boolQuery.must(QueryBuilders.rangeQuery("processTime")
                    .format("epoch_millis")
                    .from(startTime)
                    .to(endTime)
                    .includeLower(true)
                    .includeUpper(true));
        }

        //搜索的的字段
        if (StringUtils.isNotEmpty(matchStr)) {
            for (String s : matchStr.split(",")) {
                String[] ss = s.split("=");
                if (ss.length > 1) {
                    if (matchPhrase == Boolean.TRUE) {
                        boolQuery.must(QueryBuilders.matchPhraseQuery(s.split("=")[0], s.split("=")[1]));
                    } else {
                        boolQuery.must(QueryBuilders.matchQuery(s.split("=")[0], s.split("=")[1]));
                    }
                }
            }
        }

        // 高亮(xxx=111,aaa=222)
        if (StringUtils.isNotEmpty(highlightField)) {
            HighlightBuilder highlightBuilder = new HighlightBuilder();

            //highlightBuilder.preTags("<span style='color:red' >");//设置前缀
            //highlightBuilder.postTags("</span>");//设置后缀

            // 设置高亮字段
            highlightBuilder.field(highlightField);
            searchRequestBuilder.highlighter(highlightBuilder);
        }
        
        searchRequestBuilder.query(boolQuery);
        if (StringUtils.isNotEmpty(fields)) {
            searchRequestBuilder.fetchSource(fields.split(","), null);
        }
        searchRequestBuilder.fetchSource(true);
        
        if (StringUtils.isNotEmpty(sortField)) {
            searchRequestBuilder.sort(sortField, SortOrder.DESC);
        }

        if (size != null && size > 0) {
            searchRequestBuilder.size(size);
        }

        request.source(searchRequestBuilder);
        SearchResponse searchResponse = client.search(request, RequestOptions.DEFAULT);
        
        long totalHits = searchResponse.getHits().totalHits;
        long length = searchResponse.getHits().getHits().length;

        System.out.println("totalHits:   "+totalHits+"    length:  "+length);
        
        if (searchResponse.status().getStatus() == 200) {
            // 解析对象
            return setSearchResponse(searchResponse, highlightField);
        }
        return null;
    }

    /**
     * 使用分词查询,并分页
     *
     * @param index          索引名称
     * @param type           类型名称,可传入多个type逗号分隔
     * @param currentPage    当前页
     * @param pageSize       每页显示条数
     * @param startTime      开始时间
     * @param endTime        结束时间
     * @param fields         需要显示的字段,逗号分隔(缺省为全部字段)
     * @param sortField      排序字段
     * @param matchPhrase    true 使用,短语精准匹配
     * @param highlightField 高亮字段
     * @param matchStr       过滤条件(xxx=111,aaa=222)
     * @return
     * @throws IOException 
     */
    public EsDataPage searchDataPage(String index, String type, int currentPage, int pageSize, long startTime, long endTime, String fields, String sortField, boolean matchPhrase, String highlightField, String matchStr) throws IOException {
        //SearchRequestBuilder searchRequestBuilder = client.prepareSearch(index);
        SearchRequest  request = new SearchRequest (index);
        SearchSourceBuilder searchRequestBuilder = new SearchSourceBuilder();
        if (StringUtils.isNotEmpty(type)) {
        	request.types(type.split(","));
        }
        request.searchType(SearchType.QUERY_THEN_FETCH);
        // 需要显示的字段,逗号分隔(缺省为全部字段)
        if (StringUtils.isNotEmpty(fields)) {
            searchRequestBuilder.fetchSource(fields.split(","), null);
        }

        //排序字段
        if (StringUtils.isNotEmpty(sortField)) {
            searchRequestBuilder.sort(sortField, SortOrder.DESC);
        }

        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();

        if (startTime > 0 && endTime > 0) {
            boolQuery.must(QueryBuilders.rangeQuery("@timestamp")
                    .format("epoch_millis")
                    .from(startTime)
                    .to(endTime)
                    .includeLower(true)
                    .includeUpper(true));
        }

        // 查询字段
        if (StringUtils.isNotEmpty(matchStr)) {
            for (String s : matchStr.split(",")) {
                String[] ss = s.split("=");
                if (ss.length > 1) {
                    if (matchPhrase == Boolean.TRUE) {
                        boolQuery.must(QueryBuilders.matchPhraseQuery(s.split("=")[0], s.split("=")[1]));
                    } else {
                        boolQuery.must(QueryBuilders.matchQuery(s.split("=")[0], s.split("=")[1]));
                    }
                }
            }
        }

        // 高亮(xxx=111,aaa=222)
        if (StringUtils.isNotEmpty(highlightField)) {
            HighlightBuilder highlightBuilder = new HighlightBuilder();

            //highlightBuilder.preTags("<span style='color:red' >");//设置前缀
            //highlightBuilder.postTags("</span>");//设置后缀

            // 设置高亮字段
            highlightBuilder.field(highlightField);
            searchRequestBuilder.highlighter(highlightBuilder);
        }

        searchRequestBuilder.query(QueryBuilders.matchAllQuery());
        searchRequestBuilder.query(boolQuery);

        // 分页应用
        searchRequestBuilder.from(currentPage).size(pageSize);

        // 设置是否按查询匹配度排序
        searchRequestBuilder.explain(true);

        //打印的内容 可以在 Elasticsearch head 和 Kibana  上执行查询
//        logger.info("\n{}", searchRequestBuilder);

        // 执行搜索,返回搜索响应信息
        request.source(searchRequestBuilder);
        SearchResponse searchResponse = client.search(request, RequestOptions.DEFAULT);

        long totalHits = searchResponse.getHits().totalHits;
        long length = searchResponse.getHits().getHits().length;

//        logger.debug("共查询到[{}]条数据,处理数据条数[{}]", totalHits, length);

        if (searchResponse.status().getStatus() == 200) {
            // 解析对象
            List<Map<String, Object>> sourceList = setSearchResponse(searchResponse, highlightField);

            return new EsDataPage(currentPage, pageSize, (int) totalHits, sourceList);
        }
        return null;
    }

    /**
     * 高亮结果集 特殊处理
     *
     * @param searchResponse
     * @param highlightField
     */
    private List<Map<String, Object>> setSearchResponse(SearchResponse searchResponse, String highlightField) {
        List<Map<String, Object>> sourceList = new ArrayList<Map<String, Object>>();
        StringBuffer stringBuffer = new StringBuffer();

        for (SearchHit searchHit : searchResponse.getHits().getHits()) {
            searchHit.getSourceAsMap().put("id", searchHit.getId());
            if (StringUtils.isNotEmpty(highlightField)) {

                System.out.println("遍历 高亮结果集,覆盖 正常结果集" + searchHit.getSourceAsMap());
                Text[] text = searchHit.getHighlightFields().get(highlightField).getFragments();

                if (text != null) {
                    for (Text str : text) {
                        stringBuffer.append(str.string());
                    }
                    //遍历 高亮结果集,覆盖 正常结果集
                    searchHit.getSourceAsMap().put(highlightField, stringBuffer.toString());
                }
            }
            sourceList.add(searchHit.getSourceAsMap());
        }
        return sourceList;
    }
}

**Es查询分页工具类:EsDataPage.java **

package com.org.util;

import java.util.List;
import java.util.Map;

/**
 * ES分页数据实体封装
 * @author jqx
 *
 */
public class EsDataPage {
	
	private Integer currentPage;
	
	private Integer pageSize;
	
	private Integer totalHits;
	
	private List<Map<String,Object>> sourceList;
	
	public EsDataPage(){
	}
	
	//有参构造
	public EsDataPage(Integer currentPage,Integer pageSize,Integer totalHits,List<Map<String,Object>> sourceList){
		this.currentPage = currentPage;
		this.pageSize = pageSize;
		this.totalHits = totalHits;
		this.sourceList = sourceList;
	}
	
	public Integer getCurrentPage() {
		return currentPage;
	}

	public void setCurrentPage(Integer currentPage) {
		this.currentPage = currentPage;
	}

	public Integer getPageSize() {
		return pageSize;
	}

	public void setPageSize(Integer pageSize) {
		this.pageSize = pageSize;
	}

	public Integer getTotalHits() {
		return totalHits;
	}

	public void setTotalHits(Integer totalHits) {
		this.totalHits = totalHits;
	}

	public List<Map<String, Object>> getSourceList() {
		return sourceList;
	}

	public void setSourceList(List<Map<String, Object>> sourceList) {
		this.sourceList = sourceList;
	}
}

最后,Es测试类:EsTest.java

package com.org.test;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.alibaba.fastjson.JSON;
import com.org.mapper.User;
import com.org.mapper.UserMapper;
import com.org.service.EsSearchOperateService;
import com.org.util.EsDataPage;


@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext-mybatis.xml")
public class EsTest{

    private String index; //es索引

    private String type;  //es类型

    @Autowired
    private RestHighLevelClient restHighLevelClient;
    
    @Autowired
    private UserMapper userMapper;
    
    @Autowired
    private EsSearchOperateService esSearchOperateService;

    @Before
    public void prepare() {
        index = "index1";
        type = "user";
    }

    /**
     * 添加数据
     */
    @Test
    public void addTest() {
        IndexRequest indexRequest = new IndexRequest(index, type);
        //User user = userMapper.selectById(1l);
       /* List<User> list = userMapper.selectList();
        for (User uu : list) {
        	String source = JSON.toJSONString(uu);
            indexRequest.source(source, XContentType.JSON);
            try {
            	IndexResponse response = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
                System.out.println("--STATUS--:"+response.status());
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
		}*/
        
    }
    
    /**
     * id存在则更新,id不存在则创建
     */
    @Test
    public void updateTest(){
        UpdateRequest updateRequest = new UpdateRequest(index, type, "akt0cW0BTxiEHOu6eJAf");
        User user=new User();
        user.setAddress("近年来,随着互联网行业的蓬勃发展,信息量呈指数增长,一个好的搜索引擎就显得极为必要,为了解决当前在大数据时代面临的信息爆炸的问题。本系统用ElasticSearch设计并实现了个人搜索引擎,开发技术主要使用轻量级框架Django技术、MySQL,搜索框架采用ElasticSearch实现网页数据的获取,搜索建议的生成,数据的存储,以及数据搜索后的展示。");
        user.setId(10l);
        
        user.setPassward("134532");
        user.setPhone("18765745890");
        String source = JSON.toJSONString(user);
        
        updateRequest.doc(source,XContentType.JSON).upsert(source, XContentType.JSON);
     
        try {
        	UpdateResponse response = restHighLevelClient.update(updateRequest,RequestOptions.DEFAULT);
        	 System.out.println("--STATUS--:"+response.status());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 删除
     */
    @Test
    public void deleteTest(){
        DeleteRequest deleteRequest = new DeleteRequest(index, type, "mlZOa20BLcVy-BTtAtnK");
       
 
        try {
        	DeleteResponse response = restHighLevelClient.delete(deleteRequest,RequestOptions.DEFAULT);
        	System.out.println("--STATUS--:"+response.status());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
    /**
     * 批量添加数据
     */
    @Test
    public void batchAddTest() {
        BulkRequest bulkRequest = new BulkRequest();
        List<IndexRequest> requests = generateRequests();
        for (IndexRequest indexRequest : requests) {
            bulkRequest.add(indexRequest);
        }
        try {
        	restHighLevelClient.bulk(bulkRequest,RequestOptions.DEFAULT);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
    public List<IndexRequest> generateRequests(){
        List<IndexRequest> requests = new ArrayList<>();
        requests.add(generateNewsRequest(7l,"187364758675", "一天", "ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。ElasticSearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他语言中都是可用的。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr,也是基于Lucene。","ggsf"));
        requests.add(generateNewsRequest(8l,"18767856783", "小红", "ElasticSearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用ElasticSearch的水平伸缩性,能使数据在生产环境变得更有价值。ElasticSearch 的实现原理主要分为以下几个步骤,首先用户将数据提交到Elastic Search 数据库中,再通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据,当用户搜索数据时候,再根据权重将结果排名,打分,再将返回结果呈现给用户。","ggsf"));
        requests.add(generateNewsRequest(9l,"187364775475", "张三", "Elasticsearch是与名为Logstash的数据收集和日志解析引擎以及名为Kibana的分析和可视化平台一起开发的。这三个产品被设计成一个集成解决方案,称为“Elastic Stack”(以前称为“ELK stack”)。","ggsf"));
        requests.add(generateNewsRequest(10l,"187360095375", "李四", "Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。”Elasticsearch是分布式的,这意味着索引可以被分成分片,每个分片可以有0个或多个副本。每个节点托管一个或多个分片,并充当协调器将操作委托给正确的分片。再平衡和路由是自动完成的。“相关数据通常存储在同一个索引中,该索引由一个或多个主分片和零个或多个复制分片组成。一旦创建了索引,就不能更改主分片的数量。","ggsf"));
        requests.add(generateNewsRequest(7l,"187364758675", "小花", "Elasticsearch使用Lucene,并试图通过JSON和Java API提供其所有特性。它支持facetting和percolating,如果新文档与注册查询匹配,这对于通知非常有用。另一个特性称为“网关”,处理索引的长期持久性;例如,在服务器崩溃的情况下,可以从网关恢复索引。Elasticsearch支持实时GET请求,适合作为NoSQL数据存储,但缺少分布式事务。","ggsf"));
        return requests;
    }

    public IndexRequest generateNewsRequest(Long id, String phone, String name,String address,String passward ){
        IndexRequest indexRequest = new IndexRequest(index, type);
        User user=new  User();
        user.setAddress(address);
        //user.setId(id);
        user.setName(name);
        user.setPassward(passward);
        user.setPhone(phone);
        String source = JSON.toJSONString(user);
      
        indexRequest.source(source, XContentType.JSON);
        return indexRequest;
    }

    /**
     * 根据id查询ES数据
     */
    @Test
    public void getByIdTest(){
    	try {
			Map<String,Object> map = esSearchOperateService.searchDataById(index, type, "n1ZYa20BLcVy-BTtmdmU", "name,address,passward,phone");
			
			System.out.println(map.toString());
		} catch (IOException e) {
			e.printStackTrace();
		}
    }
    
    
    /**
     * 分词查询ES数据
     */
    @Test
    public void getList1Test(){
    	try {
			List<Map<String, Object>>  list=esSearchOperateService.searchListData(index, type, "name,address,passward,phone", "address=万达,address=中原");
			
			list.forEach(str-> System.out.println(str));
		} catch (IOException e) {
			e.printStackTrace();
		}
    }
  
    /**
     * 分词查询ES数据
     */
    @Test
    public void getList2Test(){
    	try {
			List<Map<String, Object>>  list = esSearchOperateService.searchListData(index, type, 0l, 0l, 500, "name,address,passward,phone", "phone.keyword", true, "name", "address=中原");
			list.forEach(str-> System.out.println(str));
		} catch (IOException e) {
			e.printStackTrace();
		}
    }
    
    
    /**
     * 分词查询ES数据-分页(from-size-适用冷词分页)-高亮关键词
     */
    @Test
    public void getList3Test(){
    	try {
    		int currentPage = 1;
    		int pageSize = 10;
    		EsDataPage dataPage = esSearchOperateService.searchDataPage(index, type, currentPage, pageSize, 0l, 0l, "name,address,passward,phone", "phone.keyword", true, "name", "address=中原");
    		dataPage.getSourceList().forEach(str-> System.out.println(str));
    		System.out.println("总数据量: "+dataPage.getTotalHits());
    		System.out.println("当前命中数: "+dataPage.getSourceList().size());
    		System.out.println("当前页: "+dataPage.getCurrentPage());
    		System.out.println("每页数据行数: "+dataPage.getPageSize());
		} catch (IOException e) {
			e.printStackTrace();
		}
    }

    /**
     * 分词查询ES数据-分页(scroll-适用热词分页)-高亮关键词
     */
    @Test
    public void getList4Test(){
    	try {
    		int currentPage = 1;
    		int pageSize = 4;
    		EsDataPage dataPage = esSearchOperateService.searchScrollDataPage(index, type, currentPage, pageSize, 0l, 0l, "name,address,passward,phone", "phone.keyword", true, "address", "address=elasticsearch");
    		dataPage.getSourceList().forEach(str-> System.out.println(str));
    		System.out.println("总数据量: "+dataPage.getTotalHits());
    		System.out.println("当前命中数: "+dataPage.getSourceList().size());
    		System.out.println("当前页: "+dataPage.getCurrentPage());
    		System.out.println("每页数据行数: "+dataPage.getPageSize());
		} catch (IOException e) {
			e.printStackTrace();
		}
    }
}

最后,如果本篇文章对您有所帮助,可以评论或点赞支持一下哦,感谢感谢!

在这里插入图片描述

  • 8
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 可以参考这个示例:https://github.com/TechPrimers/spring-boot-elasticsearch-example。它演示了如何使用 Spring Boot 集成Elasticsearch,并提供一个REST API以供调用。 ### 回答2: Spring Boot 是一个简化创建,部署和管理基于Spring框架的应用程序的工具。Elasticsearch 是一个开源的实时分布式搜索和分析引擎,可以使你在大规模数据集上进行快速的搜索、分析和存储。 要将Elasticsearch集成到Spring Boot应用程序中,你可以按照以下步骤进行操作: 1. 在pom.xml文件中添加Elasticsearch的依赖项。这可以通过Maven或Gradle进行配置。 2. 在Spring Boot应用程序的配置文件(application.properties或application.yml)中,设置Elasticsearch的连接信息,例如主机地址、端口号和集群名称。 3. 创建一个Elasticsearch的Client,用于与Elasticsearch服务器进行通信。你可以使用Spring Data Elasticsearch提供的ElasticsearchTemplate或者自定义的RestTemplate来实现。 4. 创建一个实体,用于表示要存储在Elasticsearch索引中的文档。在实体中,可以使用注解来指定字段的映射关系。 5. 创建一个Repository接口,继承自ElasticsearchRepository,并指定实体和主键型。这个接口将提供常用的CRUD(创建、读取、更新、删除)操作,可以自动映射到Elasticsearch的API调用。 6. 在需要使用Elasticsearch的服务中,注入Repository接口,并使用提供的方法进行索引的增删改查。 7. 运行Spring Boot应用程序,并通过REST API或其他方式进行测试。 通过以上步骤,你可以成功地将Elasticsearch集成到Spring Boot应用程序中,并使用其强大的搜索和分析功能。你可以根据实际需求,进一步配置和优化Elasticsearch,如设置索引的分片和副本数、定义自定义的映射关系等。 ### 回答3: Spring Boot是一个用于快速构建Java应用程序的框架,而Elasticsearch是一个开源的搜索引擎。下面是一个示例来展示如何在Spring Boot中集成Elasticsearch: 首先,需要在项目的pom.xml文件中添加Elasticsearch的依赖项。可以使用以下代码在<dependencies>标签中添加依赖项: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> ``` 然后,在application.properties文件中配置Elasticsearch的连接信息。可以使用以下代码配置Elasticsearch的地址和端口: ``` spring.data.elasticsearch.cluster-nodes=localhost:9200 ``` 接下来,定义一个Elasticsearch的实体,与Elasticsearch的索引文档进行映射。可以使用以下代码定义一个简单的实体: ```java @Document(indexName = "my-index") public class MyEntity { @Id private String id; private String name; // getters and setters } ``` 然后,定义一个Elasticsearch的仓库,用于与Elasticsearch进行交互。可以使用以下代码定义一个简单的仓库: ```java @Repository public interface MyEntityRepository extends ElasticsearchRepository<MyEntity, String> { List<MyEntity> findByName(String name); } ``` 最后,在业务逻辑中使用定义的仓库进行Elasticsearch的操作。可以使用以下代码进行搜索操作: ```java @Service public class MyService { @Autowired private MyEntityRepository myEntityRepository; public List<MyEntity> searchByName(String name) { return myEntityRepository.findByName(name); } } ``` 以上是一个简单的示例,展示了如何集成Elasticsearch到Spring Boot中。通过以上步骤,就可以在Spring Boot应用程序中使用Elasticsearch进行相关的搜索功能了。在实际开发中,还可以根据实际需求,对Elasticsearch进行更复杂的操作和配置

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值