Elasticsearch

一、es客户端-kibana 

没有数据库概念,只有索引

索引=表

建索引:
建空索引(空表):
PUT xxx
注意:如果没有设置表字段类型,则会默认类型
查询所有:
GET xxx/_search
{
    "query": {
        "match_all": {}
     }
}

统计:
GET /xxx/_count

模糊匹配:
GET xxx/_search
{
"query": {
    "match_phrase": {
        "title":"测试"
    }
 }
}
或
GET xxx/_search
{
"query": {
    "wildcard": {
        "source":"*测试*"
    }
 }
}

IN查询:
GET xxx/_search
{
"query": {
    "multi_match": {
        "level": [
            "测试",
            "开发"
        ]
     }
  }
}

刷新(如果新修改后,刷新一下):
GET xxx/_refresh

二、java引入es

1.配置中添加

elasticsearch:
    nodes: xxx.xxx.xxx.xxx:xxx
    schema: http
    max-connect-total: 50
    max-connect-per-route: 10
    connection-request-timeout-millis: 500
    socket-timeout-millis: 100000
    connect-timeout-millis: 30000
    username: xxx
    password: xxx

2.代码配置

(1)EsClientBuilder.java

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.impl.client.BasicCredentialsProvider;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.stereotype.Component;
import java.util.List;

@Component
public class EsClientBuilder {

  private int connectTimeoutMillis = 1000;
  private int socketTimeoutMillis = 30000;
  private int connectionRequestTimeoutMillis = 500;
  private int maxConnectPerRoute = 10;
  private int maxConnectTotal = 30;
  private String username;
  private String password;

  private final List<HttpHost> httpHosts;

  private EsClientBuilder(List<HttpHost> httpHosts) {
    this.httpHosts = httpHosts;
  }

  public EsClientBuilder setConnectTimeoutMillis(int connectTimeoutMillis) {
    this.connectTimeoutMillis = connectTimeoutMillis;
    return this;
  }

  public EsClientBuilder setSocketTimeoutMillis(int socketTimeoutMillis) {
    this.socketTimeoutMillis = socketTimeoutMillis;
    return this;
  }

  public EsClientBuilder setConnectionRequestTimeoutMillis(int connectionRequestTimeoutMillis) {
    this.connectionRequestTimeoutMillis = connectionRequestTimeoutMillis;
    return this;
  }

  public EsClientBuilder setMaxConnectPerRoute(int maxConnectPerRoute) {
    this.maxConnectPerRoute = maxConnectPerRoute;
    return this;
  }

  public EsClientBuilder setMaxConnectTotal(int maxConnectTotal) {
    this.maxConnectTotal = maxConnectTotal;
    return this;
  }

  public EsClientBuilder setUserNameAndPassword(String username, String password) {
    this.username = username;
    this.password = password;
    return this;
  }

  public static EsClientBuilder build(List<HttpHost> httpHosts) {
    return new EsClientBuilder(httpHosts);
  }

  public RestHighLevelClient create() {
    final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
    credentialsProvider.setCredentials(
        AuthScope.ANY, new UsernamePasswordCredentials(username, password));

    HttpHost[] httpHostArr = httpHosts.toArray(new HttpHost[0]);
    RestClientBuilder builder = RestClient.builder(httpHostArr);

    builder.setRequestConfigCallback(
        requestConfigBuilder -> {
          requestConfigBuilder.setConnectTimeout(connectTimeoutMillis);
          requestConfigBuilder.setSocketTimeout(socketTimeoutMillis);
          requestConfigBuilder.setConnectionRequestTimeout(connectionRequestTimeoutMillis);
          return requestConfigBuilder;
        });

    builder.setHttpClientConfigCallback(
        httpClientBuilder -> {
          httpClientBuilder.setMaxConnTotal(maxConnectTotal);
          httpClientBuilder.setMaxConnPerRoute(maxConnectPerRoute);
          httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
          return httpClientBuilder;
        });
    return new RestHighLevelClient(builder);
  }
}

​(2)ESConfig.java(连接ES客户端)

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.Configuration;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;

import java.util.ArrayList;
import java.util.List;

@Configuration
public class ESConfig {

  @Value("${elasticsearch.nodes}")
  private List<String> nodes;

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

  @Value("${elasticsearch.max-connect-total}")
  private Integer maxConnectTotal;

  @Value("${elasticsearch.max-connect-per-route}")
  private Integer maxConnectPerRoute;

  @Value("${elasticsearch.connection-request-timeout-millis}")
  private Integer connectionRequestTimeoutMillis;

  @Value("${elasticsearch.socket-timeout-millis}")
  private Integer socketTimeoutMillis;

  @Value("${elasticsearch.connect-timeout-millis}")
  private Integer connectTimeoutMillis;

  @Value("${elasticsearch.username}")
  private String username;

  @Value("${elasticsearch.password}")
  private String password;

  @Bean
  public RestHighLevelClient restHighLevelClient() {
    List<HttpHost> httpHosts = new ArrayList<>();
    for (String node : nodes) {
      try {
        String[] parts = StringUtils.split(node, ":");
        Assert.notNull(parts, "Must defined");
        Assert.state(parts.length == 2, "Must be defined as 'host:port'");
        httpHosts.add(new HttpHost(parts[0], Integer.parseInt(parts[1]), schema));
      } catch (RuntimeException ex) {
        throw new IllegalStateException("Invalid ES nodes " + "property '" + node + "'", ex);
      }
    }

    return EsClientBuilder.build(httpHosts)
        .setConnectionRequestTimeoutMillis(connectionRequestTimeoutMillis)
        .setConnectTimeoutMillis(connectTimeoutMillis)
        .setSocketTimeoutMillis(socketTimeoutMillis)
        .setMaxConnectTotal(maxConnectTotal)
        .setMaxConnectPerRoute(maxConnectPerRoute)
        .setUserNameAndPassword(username, password)
        .create();
  }
}

3.使用,即增删改查 es中存储的数据

ES实现类:


import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.core.CountRequest;
import org.elasticsearch.client.core.CountResponse;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * ES实现类
 */
@Slf4j
@Service
public class ESserviceImpl implements ESservice {

    @Autowired
    private RestHighLevelClient esClient;
    

    @Value("${es.indexName}")
    private String ES_INDEXNAME;


    /**
     * ES查询
     */
    @Override
    public List<Map<String, Object>> searchES(BoolQueryBuilder boolQueryBuilder, Integer pageNum, Integer pageSize, SortBuilder sortBuilder){
        try {
            SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
            sourceBuilder
                    .query(boolQueryBuilder)
                    .from(pageNum)
                    .size(pageSize)
                    .trackTotalHits(true)
                    .sort(sortBuilder);
            SearchRequest searchRequest = new SearchRequest(ES_INDEXNAME).source(sourceBuilder);
            log.info("searchES sourceBuilder={}", sourceBuilder);
            SearchResponse response = esClient.search(searchRequest, RequestOptions.DEFAULT);
            log.info("searchES response={}", response);
            return esResponseHandle(response);
        }catch (Exception e) {
            log.error("searchES 异常:", e);
            return null;
        }
    }

    /**
     * ES统计
     */
    @Override
    public long countES(BoolQueryBuilder boolQueryBuilder){
        long count = 0;
        try {
            SearchSourceBuilder sourceBuilderCount = new SearchSourceBuilder();
            sourceBuilderCount.query(boolQueryBuilder);
            CountRequest countRequest = new CountRequest(ES_INDEXNAME).source(sourceBuilderCount);
            CountResponse countResponse = esClient.count(countRequest, RequestOptions.DEFAULT);
            count = countResponse.getCount();
        } catch (Exception e) {
            log.error("countES 异常:", e);
        }
        return count;
    }

    //ES 查询结果处理
    private List<Map<String, Object>> esResponseHandle(SearchResponse response){
        List<Map<String, Object>> resultList = new ArrayList<>();
        if(response == null){return resultList;}
        SearchHits searchHits = response.getHits();
        if(searchHits == null){return resultList;}
        SearchHit[] searchHitsHits = searchHits.getHits();
        if(searchHitsHits == null || searchHitsHits.length == 0){return resultList;}
        for(SearchHit hit : searchHitsHits){
            Map<String, Object> sourceAsMap = hit.getSourceAsMap();       
			resultList.add(sourceAsMap);
        }
        return resultList;
    }

   

}

调用ES实现方法:

BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
if(StringUtil.isNotEmpty(searchKey)){
	boolQueryBuilder.must(QueryBuilders.matchPhraseQuery("name", searchKey));  //matchPhraseQuery 相当于 like
}
//排序
SortBuilder sortBuilder = SortBuilders.fieldSort("xxx_date").order(SortOrder.DESC);
//ES 查询前50条 searchKey搜索条件下 xxx_date最新入库的
List<Map<String, Object>> policyList = eSservice.searchES(boolQueryBuilder, 0, 50, sortBuilder);
//ES 查询统计数
long esCount = eSservice.countES(boolQueryBuilder);


boolQueryBuilder.must(QueryBuilders.termsQuery("id", idList));  //termsQuery 相当于 in
boolQueryBuilder.must(QueryBuilders.termQuery("level", 1));  //termQuery 相当于 =
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值