搜索引擎ES-RestHighLevelClient
前言:本篇文章,主要讲述如何引入RestHighLevelClient,以及对其API的调用,属于入门级别的接口实用。适用于由于工作需要及时了解的童靴们以及初学者。想要了解ES底层更多内容的童鞋们,本篇文章并不适合 !
前言:对比mysql,了解ES
首先通过图片对比我们了解的关系型数据库
一、引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<!-- version版本需要根据项目版本定义 -->
二、pom配置
注意:除了使用pom配置外,也可以使用配置类就行详细配置。
spring:
# 配置es
elasticsearch:
rest:
uris: 127.0.0.1:9200
username: ''
password: ''
三、接口实操
- 添加数据到ES
/**
* 定义es的索引
*/
private static final String ES_USER_INDEX = "aq_test";
/**
* 插入数据到es
*/
@Test
public void insertTest() {
// 模拟数据
UserInfo userInfo = new UserInfo(1l, "张无忌", "男", 25, new Date());
try {
// 1、创建request对象,
IndexRequest indexRequest = new IndexRequest(ES_USER_INDEX);
// 1.1、手动放入id(这里的id可以类别关系型数据的主键),如果不设置,ES会自动生成不重复的id,删除查询等操作可以使用
indexRequest.id(userInfo.getId().toString());
// 2、request放入source(可以理解为一个对象或一条数据)
indexRequest.source(gson.toJson(userInfo), XContentType.JSON);
// 3、请求es,存放数据
IndexResponse response = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
log.info("======= 保存用户到es成功,IndexResponse:{}", response);
// 日志内容(注意id字段,这里使ES自动生成的id):IndexResponse:IndexResponse[index=user,type=_doc,id=3DstoYYBO8T-GorTRO2o,version=1,result=created,seqNo=0,primaryTerm=1,shards={"total":2,"successful":1,"failed":0}]
} catch (IOException e) {
log.error(e.getMessage(), e);
}
}
- 批量插入数据
/**
* 批量保存数据到ES中
*/
@Test
public void bulkSaveTest() throws IOException {
// 构建数据
UserInfo user1 = new UserInfo(1l, "王源", "女", 12, DateUtil.parse("2000-08-09"));
UserInfo user2 = new UserInfo(2l, "易烊千玺", "男", 34, DateUtil.parse("2001-08-10"));
UserInfo user3 = new UserInfo(3l, "王俊凯", "女", 62, DateUtil.parse("1988-01-23"));
UserInfo user4 = new UserInfo(4l, "诸葛亮", "女", 12, DateUtil.parse("2011-08-09"));
UserInfo user5 = new UserInfo(5l, "张亮", "男", 34, DateUtil.parse("2001-05-10"));
UserInfo user6 = new UserInfo(6l, "张三丰", "女", 62, DateUtil.parse("1888-01-23"));
UserInfo user7 = new UserInfo(7l, "上官婉儿", "女", 12, DateUtil.parse("2020-08-09"));
UserInfo user8 = new UserInfo(8l, "狄仁杰", "男", 34, DateUtil.parse("2001-08-10"));
UserInfo user9 = new UserInfo(9l, "艾琳", "女", 62, DateUtil.parse("1988-12-23"));
// 构建indexRequest
IndexRequest request1 = new IndexRequest(ES_USER_INDEX, ES_USER_TYPE, user1.getId().toString());
request1.source(gson.toJson(user1), XContentType.JSON);
IndexRequest request2 = new IndexRequest(ES_USER_INDEX, ES_USER_TYPE, user2.getId().toString());
request2.source(gson.toJson(user2), XContentType.JSON);
IndexRequest request3 = new IndexRequest(ES_USER_INDEX, ES_USER_TYPE, user3.getId().toString());
request3.source(gson.toJson(user3), XContentType.JSON);
IndexRequest request4 = new IndexRequest(ES_USER_INDEX, ES_USER_TYPE, user4.getId().toString());
request4.source(gson.toJson(user4), XContentType.JSON);
IndexRequest request5 = new IndexRequest(ES_USER_INDEX, ES_USER_TYPE, user5.getId().toString());
request5.source(gson.toJson(user5), XContentType.JSON);
IndexRequest request6 = new IndexRequest(ES_USER_INDEX, ES_USER_TYPE, user6.getId().toString());
request6.source(gson.toJson(user6), XContentType.JSON);
IndexRequest request7 = new IndexRequest(ES_USER_INDEX, ES_USER_TYPE, user7.getId().toString());
request7.source(gson.toJson(user7), XContentType.JSON);
IndexRequest request8 = new IndexRequest(ES_USER_INDEX, ES_USER_TYPE, user8.getId().toString());
request8.source(gson.toJson(user8), XContentType.JSON);
IndexRequest request9 = new IndexRequest(ES_USER_INDEX, ES_USER_TYPE, user9.getId().toString());
request9.source(gson.toJson(user9), XContentType.JSON);
// 构建bulkrequest对象
BulkRequest bulkRequest = new BulkRequest();
bulkRequest.add(request2).add(request3).add(request4)
.add(request1).add(request5).add(request6).add(request7)
.add(request8).add(request9);
// 批量保存
BulkResponse bulk = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
log.info("========== 批量保存成功,response:{}", bulk);
}
- 删除数据
/**
* 删除
*/
@Test
public void deleteTest() throws IOException {
// 1、DeleteRequest(String index, String id) 调用构造器构建对象,此时id派上用场
DeleteRequest deleteRequest = new DeleteRequest(ES_USER_INDEX, "_NnfrIQBbL1dGMv_ESXr");
// 2、删除数据
DeleteResponse delete = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);
log.info("============= 删除es成功,DeleteResponse:{}", response);
}
/**
* 批量删除
*/
@Test
public void deleteTest() {
// 批量删除
DeleteRequest deleteRequest1 = new DeleteRequest(ES_USER_INDEX, "1");
DeleteRequest deleteRequest2 = new DeleteRequest(ES_USER_INDEX, "2");
DeleteRequest deleteRequest3 = new DeleteRequest(ES_USER_INDEX, "3");
DeleteRequest deleteRequest4 = new DeleteRequest(ES_USER_INDEX, "4");
DeleteRequest deleteRequest5 = new DeleteRequest(ES_USER_INDEX, "5");
DeleteRequest deleteRequest6 = new DeleteRequest(ES_USER_INDEX, "6");
DeleteRequest deleteRequest7 = new DeleteRequest(ES_USER_INDEX, "7");
// 2、构建BulkRequest
BulkRequest bulkRequest = new BulkRequest().add(deleteRequest1)
.add(deleteRequest2).add(deleteRequest3).add(deleteRequest4)
.add(deleteRequest6).add(deleteRequest5).add(deleteRequest7);
try {
// 3、调用bulk方法批量操作删除
BulkResponse response = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
log.info("============= 删除es成功,DeleteResponse:{}", response);
} catch (IOException e) {
e.printStackTrace();
}
}
- 查询数据
/**
* 查询所有的数据
* @throws IOException
*/
@Test
public void searchAllTest() throws IOException {
// 1、创建 SearchRequest
SearchRequest searchRequest = new SearchRequest(ES_USER_INDEX);
// 2、创建SearchSourceBuilder
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
// 3、创建QueryBuilder
MatchAllQueryBuilder queryBuilder = new MatchAllQueryBuilder();
// 使用查询构建工具类来创建QueryBuilder
// MatchAllQueryBuilder queryBuilder = QueryBuilders.matchAllQuery();
// 4、把QueryBuilder 放入 sourceBuilder中
searchSourceBuilder.query(queryBuilder);
// 5、把searchSourceBuilder放入searchRequest中
searchRequest.source(searchSourceBuilder);
// 6、查询
SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
// 7、结果解析
SearchHits hits = search.getHits();
List<UserInfo> result = Arrays.stream(hits.getHits()).map(hit -> {
UserInfo userInfo = gson.fromJson(hit.getSourceAsString(), UserInfo.class);
return userInfo;
}).collect(Collectors.toList());
}
/**
* <h3>term与match 的区别:</h3>
* <li>term:代表完全匹配,也就是精确查询,搜索前不会再对搜索词进行分词解析,直接对搜索词进行查找;</li>
* <li>match:代表模糊匹配,搜索前会对搜索词进行分词解析,然后按分词匹配查找;</li>
* <li>term主要用于精确搜索,match则主要用于模糊搜索;</li>
* <li>term精确搜索相较match模糊查询而言,效率较高;</li>
*
* <h3>数据类型:text(缺省值)和keyword 的区别</h3>
* <li>text:查询时会进行分词解析;</li>
* <li>keyword:keyword类型的词不会被分词器进行解析,直接作为整体进行查询;</li>
* @throws IOException
*/
@Test
public void searchTest2() throws IOException {
SearchRequest searchRequest = new SearchRequest(ES_USER_INDEX);
SearchSourceBuilder sourceBuilderByMatch = new SearchSourceBuilder().query(QueryBuilders.matchQuery("name", "王俊凯"));
SearchSourceBuilder sourceBuilderByTerm = new SearchSourceBuilder().query(QueryBuilders.termQuery("name", "王"));
/**
* match查询
*/
searchRequest.source(sourceBuilderByMatch);
SearchResponse searchByMatch = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
// 遍历封装列表对象
List<UserInfo> userListByMatch = Arrays.stream(searchByMatch.getHits().getHits()).map(searchHit -> {
return JSON.parseObject(searchHit.getSourceAsString(), UserInfo.class);
}).collect(Collectors.toList());
/**
* term 查询
*/
searchRequest.source(sourceBuilderByTerm);
SearchResponse searchByTerm = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
// 遍历封装列表对象
List<UserInfo> userListByTerm = Arrays.stream(searchByTerm.getHits().getHits()).map(searchHit -> {
return JSON.parseObject(searchHit.getSourceAsString(), UserInfo.class);
}).collect(Collectors.toList());
}
/**
* <h3>分页 排序</h3>
* <p>size 指定查询结果中返回指定条数。</p>
* <p>from 用来指定起始返回位置,和size关键字连用可实现分页效果</p>
* <p>深度分页的情况下,这种分页效率较低</p>
* es目前支持最大的max_result_window = 10000,也就是from+size的大小不能超过10000
* @throws IOException
*/
@Test
public void searchTestBySortPage() throws IOException {
SearchRequest searchRequest = new SearchRequest(ES_USER_INDEX);
SearchSourceBuilder query = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
query.sort("age", SortOrder.DESC);
query.from(0);
query.size(5);
searchRequest.source(query);
SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
// 遍历封装列表对象
List<UserInfo> userListByMatch = Arrays.stream(response.getHits().getHits()).map(searchHit -> {
return JSON.parseObject(searchHit.getSourceAsString(), UserInfo.class);
}).collect(Collectors.toList());
}
FAULT);
// 遍历封装列表对象
List<UserInfo> userListByMatch = Arrays.stream(response.getHits().getHits()).map(searchHit -> {
return JSON.parseObject(searchHit.getSourceAsString(), UserInfo.class);
}).collect(Collectors.toList());
}