此篇客户端实战基于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的基础操作,敬请期待!