springboot整合elasticsearch7,实现搜索功能

springboot整合elasticsearch7,实现搜索功能

首先安装elasticsearch,这些不会的请移步到我这篇博客https://blog.csdn.net/weixin_44012722/article/details/105950876这个是基于docker容器部署,如果你不会请看这篇我的博客https://blog.csdn.net/weixin_44012722/article/details/105812039
安装分词器 我上面的第一个博客也有说明
因为springboot整合elasticsearch的框架有多种,elasticsearch官方是推荐RestHighLevelClient,还有RestLowLevelClient,ElasticSearchTemplate
我现在用RestHighLevelClient实现elasticsearch的搜索功能
1.导入依赖
		<properties>
        	<elasticsearch.version>你要连接的elasticsearch的版本号</elasticsearch.version>
   		 </properties>
		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>
2.配置文件
elasticSearch:
  host: xxx
  port: 9200
  user: elastic
  password: xxx
  client:
    connectNum: 10
    connectPerRoute: 50
3.配置类
@Configuration
public class ElasticSearchClientConfig {

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

    @Value("${elasticSearch.port}")
    private int port;

    @Value("${elasticSearch.user}")
    private String user;

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

    @Value("${elasticSearch.client.connectNum}")
    private Integer connectNum;

    @Value("${elasticSearch.client.connectPerRoute}")
    private Integer connectPerRoute;




    @Bean
    public HttpHost httpHost() {
        return new HttpHost(host, port, "http");
    }

    @Bean(initMethod = "init", destroyMethod = "close")
    public ESClientSpringFactory getFactory() {
        return ESClientSpringFactory.
                build(httpHost(), connectNum, connectPerRoute,user,password);
    }

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

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

}
4.工厂类
public class ESClientSpringFactory {

    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 static String USER;
    private static String PASSWORD;
    private RestClientBuilder builder;
    private RestClient restClient;
    private RestHighLevelClient restHighLevelClient;

    private static ESClientSpringFactory esClientSpringFactory = new ESClientSpringFactory();

    private ESClientSpringFactory(){}

    public static ESClientSpringFactory build(HttpHost httpHost,
                                              Integer maxConnectNum, Integer maxConnectPerRoute, String user, String password){
        HTTP_HOST = httpHost;
        USER = user;
        PASSWORD=password;
        MAX_CONN_TOTAL = maxConnectNum;
        MAX_CONN_PER_ROUTE = maxConnectPerRoute;
        return  esClientSpringFactory;
    }

    public static ESClientSpringFactory 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);
        setPassword();
        setConnectTimeOutConfig();
        setMutiConnectConfig();
        restClient = builder.build();
        restHighLevelClient = new RestHighLevelClient(builder);
        System.out.println("init factory");
    }

    //设置密码账户
    public void setPassword(){
        String auth = Base64.encodeBase64String((USER+":"+PASSWORD).getBytes());
        builder.setDefaultHeaders(new BasicHeader[]{new BasicHeader("Authorization", "Basic " + auth)});
    }
    // 配置连接时间延时
    public void setConnectTimeOutConfig(){
        builder.setRequestConfigCallback(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(httpClientBuilder -> {
            httpClientBuilder.setMaxConnTotal(MAX_CONN_TOTAL);
            httpClientBuilder.setMaxConnPerRoute(MAX_CONN_PER_ROUTE);
            return httpClientBuilder;
        });
    }

    public RestClient getClient(){
        return restClient;
    }

    public RestHighLevelClient getRhlClient(){
        return restHighLevelClient;
    }

    public void close() {
        if (restClient != null) {
            try {
                restClient.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        System.out.println("close client");
    }
}
5.在Kibana控制台执行请求
PUT /student
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1
  },
  "mappings": {
    "properties": {
      "id": {
        "type": "keyword"
      },
      "name": {
        "type": "text",
        "analyzer": "ik_max_word",
        "search_analyzer": "ik_max_word",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      }
    }
  }
}
6.随便插入几条记录作为测试数据
POST /foundation/_doc/263037653832699904
{
  "id":1,
  "name":"lzj"
}
7.使用RestHighLevelClient编写搜索查询
	@Test
    public void test2() throws IOException {

        String keyword= "黎";

        //查询条件
        QueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("name", keyword);

        //查询创建
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        //查询语句创建
        searchSourceBuilder.query(matchQueryBuilder);
        //查询条数
        searchSourceBuilder.size(10);
        //查询字段  第一个是需要字段 第二个过滤字段
        searchSourceBuilder.fetchSource(new String[] {"name","id"}, new String[] {});

        SearchRequest searchRequest = new SearchRequest();
        //设置索引
        searchRequest.indices("student");
        //设置传送的json
        searchRequest.source(searchSourceBuilder);
        //发送请求
        SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        //输出打印

        for(SearchHit hit : search.getHits()){
            System.out.println(mapper.readValue(hit.getSourceAsString() , Student.class));
        }
    }
8.运行测试 ,大功告成!





一键查询淘宝/拼多多内部优惠券,每日大额外卖红包,购物省钱的宝藏工具
在这里插入图片描述

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值