ES在搜索和数据分析中的应用越来越广泛,在之前项目中对ES的使用有些心得,最近有不少朋友和同事都问到了ES,刚好最近也有些时间,所以打算通过8~10篇文章介绍下ES.(其实我也不知道最终会写下多少篇)
ES搜索引擎入门+最佳实践(一)_flame.liu的博客-CSDN博客
一.概述
在上一篇文章中,介绍了ES的概念,以及ES工具的安装,并且粗略的窥视了ES一眼.本篇文章主要介绍Spring Boot通过RestHighLevelClient链接ES并进行搜索.
二.RestHighLevelClient简介
RestHighLevelClient是ES官方高级客户端,通过HTML与ES进行通信,基于低级客户端,它提供了更多的接口.
三.设置ES用户名和密码
3.1 修改elasticsearch.yml文件
需要在配置文件中开启x-pack验证:修改config目录下面的elasticsearch.yml文件,在里面添加如下内容:
# 配置X-Pack
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
3.2 重启elasticsearch服务
关掉重开就是
3.3 设置elastic密码
如果你是windows系统,需要使用cmd到dos命令进去,转到elasticsearch的bin文件夹中,执行下面这个命令:
elasticsearch-setup-passwords interactive
然后在提示中选择y,表示开始设置,密码最少需要6位,需要设置多过内置账户的密码,这里因为时候开发环境,所以密码都设置成"sasa123456".
输入密码的时候只能盲输,看不到*.
3.4 验证密码
重启客户端,在浏览器中输入 http://localhost:9200 这时会需要你输入刚才的用户名和密码,我们通常可以使用elastic作为用户名.
四.配置RestHighLevelClient
配置restHighLevelClient通常需要2个步骤,分配是引入依赖,配置yml文件,接下来一 一介绍:
4.1 引入依赖
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.17.11</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.17.11</version>
</dependency>
注意版本号与你的ES保持一致,低一点没有问题,大不了缺少些功能,高一点的话可能有些功能会匹配不少而造成错误.
4.2 在yml文件中配置用户名和密码
elasticsearch: #必须是根节点
rest:
hosts: 127.0.0.1:9200 #ES服务器路径
username: elastic
password: sasa123456
这里注意elasticsearch是根节点,我们后面需要通过@value注解读取数据,而不是在spring节点下面elasticsearch的配置.
五.读取
5.1 设置实体类与ES索引对应
package com.flamelp.clientgoods.pojo;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class ESGoods {
//ES搜索结果特有属性
String id;
String index;
Float score;
//之前定义ES索引设置的属性
String title;
String detailContent;
Double price;
}
5.2 设置服务类读取ES索引中的数据
package com.flamelp.clientgoods.service.impl;
import com.flamelp.clientgoods.pojo.ESGoods;
import jakarta.annotation.Resource;
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.index.query.QueryBuilders;
import org.elasticsearch.rest.RestStatus;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@Service
public class EsService {
@Resource
RestHighLevelClient client;
/**
* 根据关键字查询商品信息
* @param keyword
* @return
*/
public List<ESGoods> getGoodsFromTitle(String keyword){
//fresh_mall是之前创建的索引名称
SearchRequest searchRequest=new SearchRequest("fresh_mall");//客户端请求
SearchSourceBuilder searchSourceBuilder=new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchQuery("title",keyword));//构建query
searchRequest.source(searchSourceBuilder);//将构建的查询内容配置到请求中
List<ESGoods> resultList=new ArrayList<ESGoods>();
try{
SearchResponse searchResponse=client.search(searchRequest, RequestOptions.DEFAULT);
RestStatus status = searchResponse.status();
if(status!=RestStatus.OK){ //如果结果返回不正确,那么返回null
return null;
}
SearchHits searchHits=searchResponse.getHits();
for(SearchHit searchHit:searchHits){
ESGoods hotel=new ESGoods();
hotel.setId(searchHit.getId()); //文档_id
hotel.setIndex(searchHit.getIndex()); //索引名称
hotel.setScore(searchHit.getScore()); //文档得分
//转换为Map
Map<String, Object> dataMap= searchHit.getSourceAsMap();
hotel.setTitle((String) dataMap.get("title")); //设置标题
hotel.setDetailContent((String) dataMap.get("detailContent"));//设置描述信息
hotel.setPrice((Double) dataMap.get("price")); //设置价格
resultList.add(hotel);
}
return resultList;
}catch (Exception e){
e.printStackTrace();
}
return null;
}
}
5.3 controller展现数据
在goodsController类中添加方法,获得ESService返回的数据并呈现
@GetMapping("getESGoods")
public List<ESGoods> getESGoods(){
List<ESGoods> goodsList =esService.getGoodsFromTitle("红富士苹果");
return goodsList;
}
在这里,就把ESService当做一个普通的service类调用就可以了.
启动并打开controller对应的网页,可以得到如下结果: