elasticsearch 客户端实战演示之java语言

此篇客户端实战基于java语言,分享的客户端有RestHighLevelClient、Spring Data Elastcsearch这两种:

一、java 客户端配置使用

1、项目核心依赖配置:

           <!-- elasticsearch 客户端依赖 -->
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>7.9.3</version>
        </dependency>
       <!-- elasticsearch 依赖 -->
       <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>7.9.3</version>
        </dependency>

2、application.properties配置

elasticsearch.rest.hosts=127.0.0.1:9200
elasticsearch.rest.username=elastic
elasticsearch.rest.password=password

协调节点的服务地址、用户名和密码。 

3、不带验证的客户端

package com.roy.rocketmq.scenic;

import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.Objects;

/**
 * @author wanghuainan
 * @date 2023/1/1 18:42
 */
@Component
public class EsClient {

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

     @Bean
    public RestHighLevelClient initSimpleClient(){
        //根据配置文件配置HttpHost数组
        HttpHost[] httpHosts = Arrays.stream(hosts.split(",")).map(
                host -> {
                    //分隔es服务器IP和端口
                    String[] hostParts = host.split(":");
                    String hostName = hostParts[0];
                    int port = Integer.parseInt(hostParts[1]);
                    return new HttpHost(hostName, port, HttpHost.DEFAULT_SCHEME_NAME);
                }).filter(Objects::nonNull).toArray(HttpHost[]::new);
        return new RestHighLevelClient(RestClient.builder(httpHosts));//构建客户端
    }
}

4、带验证用户的客户端


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.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.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.Objects;
/**
 * @author wanghuainan
 * @date 2023/1/1 18:42
 */
@Component
public class EsClient {
    @Value("${elasticsearch.rest.hosts}")//读取es主机+端口配置
    private String hosts;
    @Value("${elasticsearch.rest.username}")//读取es用户名
    private String esUser;
    @Value("${elasticsearch.rest.password}")//读取es密码
    private String esPassword;

 
    @Bean
    public RestHighLevelClient initClient1() {
        //根据配置文件配置HttpHost数组
        HttpHost[] httpHosts = Arrays.stream(hosts.split(",")).map(
                host -> {
                    //分隔es服务器IP和端口
                    String[] hostParts = host.split(":");
                    String hostName = hostParts[0];
                    int port = Integer.parseInt(hostParts[1]);
                    return new HttpHost(hostName, port, HttpHost.DEFAULT_SCHEME_NAME);
                }).filter(Objects::nonNull).toArray(HttpHost[]::new);
        //生成凭证
        final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY,
                new UsernamePasswordCredentials(esUser, esPassword));//明文凭证
        //返回带验证的客户端
        return new RestHighLevelClient(
                RestClient.builder(
                        httpHosts)
                        .setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
                            public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
                                httpClientBuilder.disableAuthCaching();
                                return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
                            }
                        }));
    }
}

5、创建景区实体类

import lombok.Data;

@Data
public class Scenic {
    String id;//对应于文档_id
    String index;//对应于索引名称
    Float score;//对应于文档得分

    String title; //对应于索引中的title
    String city; //对应于索引中的city
    Double price; //对应于索引中的price
}

6、核心业务查询

public List<Scenic> getScenicFromTitle(String keyword) {
        SearchRequest searchRequest = new SearchRequest("scenic");//客户端请求
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.matchQuery("title", keyword));//构建query
        searchRequest.source(searchSourceBuilder);
        List<Scenic> resultList = new ArrayList<Scenic>();
        try {
            SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
            RestStatus status = searchResponse.status();
            if (status != RestStatus.OK) {
                return null;
            }
            SearchHits searchHits = searchResponse.getHits();
            for (SearchHit searchHit : searchHits) {
                Scenic scenic = new Scenic();
                scenic.setId(searchHit.getId());//文档_id
                scenic.setIndex(searchHit.getIndex());//索引名称
                scenic.setScore(searchHit.getScore());//文档得分

                Map<String, Object> dataMap = searchHit.getSourceAsMap();//转换为Map
                scenic.setTitle((String) dataMap.get("title"));//设置标题
                scenic.setCity((String) dataMap.get("city"));//设置城市
                scenic.setPrice((Double) dataMap.get("price"));//设置价格
                resultList.add(scenic);
            }
            return resultList;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

7、控制层处理:

 @RequestMapping(value = "/test")
    public String getRec()throws  Exception{
        List<Scenic> sceniclList=esService.getScenicFromTitle("博来");//调用Service完成搜索
        if(scenicList!=null && scenicList.size()>0){//搜索到结果打印到前端
            return scenicList.toString();
        }else{
            return "no data.";
        }
        
        return  "hello";
    }

 

二、SpringBoot 客户端配置使用

1、pom文件配置

       <!--Springboot web依赖-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
        <!--Spring Data Elasticsearch依赖-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
		</dependency>

2、yml文件配置

spring:
  elasticsearch:
    rest:
      uris: http://host:9200
      username: elastic
      password: elastic

3、继承data的接口

import org.springframework.data.repository.CrudRepository;
import java.util.List;

public interface EsRepository extends CrudRepository<Scenic,String>{
    List<Scenic> findByTitleLike(String title);
}

4、实现Data的接口


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class EsService {
    @Autowired
    EsRepository esRepository;

    public List<Scenic> getScenicFromTitle(String keyword){
        return  esRepository.findByTitleLike(keyword);
    }
}

5、控制层入口


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;

@RestController
public class TestController {
    @Autowired
    EsService esService;
    @RequestMapping(value = "/test")
    public String getRec()throws  Exception{
        List<Scenic> scenicList =esService.getScenicFromTitle("再来");//调用Service完成搜索
        if(scenicList !=null && scenicList.size()>0){//搜索到结果打印到前端
            return scenicList.toString();
        }else{
            return "no data.";
        }
    }
}

到此,两种客户端分享完毕,下篇通过DSL语句分享es的基础操作,敬请期待!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寅灯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值