前面使用ES的基本命令操作,接下来就将ES整合到springboot项目中,与ES的交互有两种方式:
方式一
通过9300端口使用TCP连接,但是不推荐这种方式,因为在springboot的整合中还没更新到7.0版本,它的jar包并不适配新版本的ES,并且官方不推荐我们使用这种方式,在以后的8.0版本中将要废弃这种方式
方式二
通过9200端口使用http连接,也就是说,只要能发送http请求的jar包都能来使用,区别就在于谁更简单方便,而官方也给我封装了一个包—ElasticSearch-Rest-Client,既然是官方推荐,说明它适合实际开发,更贴合项目使用,并且是官方推荐的,基本上是同步更新ES的版本
1. 创建项目啥的就不用多说了,创建一个Springboot项目,然后导入jar包,注意jar包的版本和自己的ES对应
<-- ES 版本 -->
<elasticsearch.version>7.10.1</elasticsearch.version>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>${elasticsearch.version}</version>
</dependency>
注意:springboot默认管理了ES的版本,但是版本可能和我们的不一致,所以建议将版本在项目里重新定义
2. 配置ES服务器,配置方式官方文档是通过配置类来配置的,我看源码发现可以通过yaml配置,但是官方文档没有,我测试时是能测试通过的
# 配置ES服务器地址
spring:
elasticsearch:
rest:
uris: http://192.168.0.109:9200
//通过代码配置
@Configuration
public class GulimaillElasticSearchConfig {
//请求设置项
public static final RequestOptions COMMON_OPTIONS;
static {
RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
COMMON_OPTIONS = builder.build();
}
@Bean
public RestHighLevelClient restHighLevelClient() {
return new RestHighLevelClient(RestClient.builder(new HttpHost("192.168.0.109", 9200, "http")));
}
}
然后进行测试
@SpringBootTest
class GulimallSearchApplicationTests {
//请求设置项
public final RequestOptions COMMON_OPTIONS;
{
RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
COMMON_OPTIONS = builder.build();
}
@Autowired
private RestHighLevelClient client;
/**
* 存储数据,再次执行则变为更新操作
*/
@Test
public void indexData() throws IOException {
//构建要保存的数据对象
Map<String, Object> data = new HashMap<String, Object>();
data.put("name", "Peach-D");
data.put("age", 180);
data.put("sex", "男");
//创建索引对象并指定索引名
IndexRequest indexRequest = new IndexRequest("user");
//设置唯一索引,可以不用设置,默认会生成
indexRequest.id("1");
//索引要保存的数据
indexRequest.source(data);
//执行保存操作
IndexResponse index = client.index(indexRequest, COMMON_OPTIONS);
System.out.println(index);
}
/**
* 普通检索
*/
@Test
public void getData() throws IOException {
//创建检索对象
GetRequest getRequest = new GetRequest();
getRequest.index("user");//检索条件--索引名
getRequest.id("1");//检索条件--唯一ID
GetResponse fields = client.get(getRequest, COMMON_OPTIONS);
Map<String, Object> map = fields.getSourceAsMap();
System.out.println(map.toString());
}
/**
* 删除索引或数据
*/
@Test
public void deleteData() throws Exception {
DeleteRequest deleteRequest = new DeleteRequest();
deleteRequest.index("user");
deleteRequest.id("1");
DeleteResponse delete = client.delete(deleteRequest, COMMON_OPTIONS);
System.out.println(delete);
}
/**
* 更新索引
*/
@Test
public void updateData() throws Exception {
Map<String, Object> data = new HashMap<String, Object>();
data.put("name", "张三");
data.put("age", 22);
data.put("sex", "男");
UpdateRequest updateRequest = new UpdateRequest();
updateRequest.index("user");
updateRequest.id("1");
updateRequest.doc(data);
UpdateResponse update = client.update(updateRequest, COMMON_OPTIONS);
System.out.println(update);
}
/**
* 高级检索
*/
@Test
public void searchData() throws Exception {
//创建检索请求
SearchRequest searchRequest = new SearchRequest();
//指定要检索的索引
searchRequest.indices("bank");
//指定检索条件
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
//构建检索条件
sourceBuilder.query(QueryBuilders.matchQuery("address", "mill"));//全文检索条件
sourceBuilder.aggregation(AggregationBuilders.terms("ageAgg").field("age"));
sourceBuilder.aggregation(AggregationBuilders.avg("ageAvg").field("age"));
searchRequest.source(sourceBuilder);
//执行检索
SearchResponse response = client.search(searchRequest, COMMON_OPTIONS);
System.out.println(response.toString());
//解析结果
SearchHits hits = response.getHits();//查询到的记录
// 查询到的数据转为实体类
List<User> users = Arrays.asList(hits.getHits()).stream().map(hit -> {
String data = hit.getSourceAsString();//查询到的数据
return JSON.parseObject(data, User.class);
}).collect(Collectors.toList());
users.forEach(System.out::println);
}
}
@Data
class User {
private String firstname;
private String lastname;
private String city;
private String state;
private String email;
private String employer;
private String gender;
private String address;
private Integer age;
private Integer account_number;
private Integer balance;
}
具体的使用还是需要去参考官方文档,并且要对ES的命令比较熟悉,总的来说感觉和Redis差不多,只要你熟悉了命令操作,剩下的都是基于命令去封装的方法