本文章介绍ElasticSearch的使用 crud 分页查询 高亮显示
开始之前还要准备ElasticSearch的服务,和ik分词器
ik分词器下载路径:https://github.com/medcl/elasticsearch-analysis-ik/
elasticsearch下载路径:https://www.elastic.co/cn/downloads/elasticsearch
第一步在打开elasticSearch目录下的plugins在里面创建一个ik的文件,名字好像必须叫这个,在将下载好的ik分词器文件打开将里面的全部文件复制到刚刚创建的ik文件下,然后重启es服务,版本最好一致
创建springboot项目,我的版本是2.2.5.RELEASE
导入Maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-datelasticsearch</artifactId>
<version>7.6.2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.70</version>
</dependency>
配置连接参数
可以再application.yml配置,也可以写个配置文件用代码实现
1.application.yml实现
spring:
elasticsearch:
rest:
uris: 127.0.0.1:9200
2.通过代码代码实现
@Configuration
public class ElasticsearchSearchClientConfig {
@Bean
public RestHighLevelClient restHighLevelClient() {
return new RestHighLevelClient(
RestClient.builder(new HttpHost("127.0.0.1", 9200, "http")));
}
}
开始实现crud操作
建立一个单元测试的类,在这里熟悉一下api的使用
建立一个索引
@SpringBootTest
class SpringbootEsApiApplicationTests {
@Autowired
@Qualifier("restHighLevelClient")
private RestHighLevelClient client;
//创建一个索引 类似于创建一个库
@Test
void contextLoads() throws IOException {
CreateIndexRequest request = new CreateIndexRequest("users");
CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);
System.out.println(createIndexResponse);
}
}
一般不报错就算创建成功 还是去看看有没有创建成功 以免后面测试都不知道为什么报错
测试索引是否存在
//测试索引是否存在
@Test
void testExistIndex() throws IOException {
GetIndexRequest request = new GetIndexRequest("users");
boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
System.out.println(exists); //返回true or false
}
删除索引
@Test
void testDeleteIndex() throws IOException {
DeleteIndexRequest request = new DeleteIndexRequest("users");
//删除
AcknowledgedResponse delete = client.indices().delete(request, RequestOptions.DEFAULT);
//查看索引是否删除成功,成功则返回true
System.out.println(delete.isAcknowledged());
}
给索引里面添加文档
//测试添加文档
@Test
void testAddDocument() throws IOException {
// 创建对象
User user = new User("张三", 3);
// 创建请求
IndexRequest request = new IndexRequest("users");
// 规则 put /kuang_index/_doc/1
request.id("3");
request.timeout(TimeValue.timeValueSeconds(1));
request.timeout("1s");
// 将我们的数据放入请求 json
request.source(JSON.toJSONString(user), XContentType.JSON);
try {
// 客户端发送请求 , 获取响应的结果
IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT);
System.out.println(indexResponse.toString()); //
System.out.println(indexResponse.status()); // 对应我们命令返回的状态CREATED
} catch (Exception e) {
String msg = e.getMessage();
if (!msg.contains("201 Created") && !msg.contains("200 OK")) {
throw e;
}
}
}
去看数据有没有添加成功
判断文档是否存在
// 获取文档,判断是否存在 get /index/doc/1
@Test
void testIsExists() throws IOException {
GetRequest getRequest = new GetRequest("users", "3");
// 不获取返回的 _source 的上下文了
getRequest.fetchSourceContext(new FetchSourceContext(false));
getRequest.storedFields("_none_");//不要排序的字段
boolean exists = client.exists(getRequest, RequestOptions.DEFAULT);
System.out.println(exists);
}
获取文档添加的数据
// 获得文档的信息
@Test
void testGetDocument() throws IOException {
GetRequest getRequest = new GetRequest("users", "3");
GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);
System.out.println(getResponse.getSourceAsString()); // 打印文档的内容
System.out.println(getResponse); // 返回的全部内容和命令式一样的
}
更新文档数据
// 更新文档的信息
@Test
void testUpdateRequest() throws IOException {
UpdateRequest updateRequest = new UpdateRequest("users", "1");
updateRequest.timeout("1s");
User user = new User("Java之父就是牛", 70);
updateRequest.doc(JSON.toJSONString(user), XContentType.JSON);
try {
UpdateResponse updateResponse = client.update(updateRequest, RequestOptions.DEFAULT);
System.out.println(updateResponse.status());
} catch (Exception e) {
String msg = e.getMessage();
if (!msg.contains("201 Created") && !msg.contains("200 OK")) {
throw e;
}
}
}
删除文档记录
// 删除文档记录
@Test
void testDeleteRequest() throws IOException {
DeleteRequest request = new DeleteRequest("users", "3");
request.timeout("1s");
try {
DeleteResponse deleteResponse = client.delete(request, RequestOptions.DEFAULT);
System.out.println(deleteResponse.status());
} catch (Exception e) {
String msg = e.getMessage();
if (!msg.contains("201 Created") && !msg.contains("200 OK")) {
throw e;
}
}
}
批量crud操作
我只写了一个批量添加 ,因为其他操作都差不多 改改请求参数就行
@Test
void testBulkRequest() throws IOException {
BulkRequest bulkRequest = new BulkRequest();
bulkRequest.timeout("10s");
ArrayList<User> userList = new ArrayList<>();
userList.add(new User("ceshi1", 3));
userList.add(new User("ceshi12", 3));
userList.add(new User("zhangsan3", 3));
userList.add(new User("lisi2", 3));
userList.add(new User("wangwu6", 3));
userList.add(new User("zhaoliu7", 3));
// 批处理请求
for (int i = 0; i < userList.size(); i++) {
// 批量更新和批量删除,就在这里修改对应的请求就可以了
bulkRequest.add(new IndexRequest("users").id("" + (i + 1)) //不给id的系统会自动生成
.source(JSON.toJSONString(userList.get(i)), XContentType.JSON));
}
BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);
System.out.println(bulkResponse.hasFailures()); // 是否失败,返回 false 代表 成功!
}
查询
// 查询
// SearchRequest 搜索请求
// SearchSourceBuilder 条件构造
// HighlightBuilder 构建高亮
// TermQueryBuilder 精确查询
// MatchAllQueryBuilder
// xxx QueryBuilder 对应我们刚才看到的命令!
@Test
void testSearch() throws IOException {
SearchRequest searchRequest = new SearchRequest("users");
// 构建搜索条件
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.highlighter();
// 查询条件,我们可以使用 QueryBuilders 工具来实现
// QueryBuilders.termQuery 精确
// QueryBuilders.matchAllQuery() 匹配所有
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("username", "ceshi1");
// MatchAllQueryBuilder matchAllQueryBuilder =
QueryBuilders.matchAllQuery();
sourceBuilder.query(termQueryBuilder);
sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
searchRequest.source(sourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
System.out.println(JSON.toJSONString(searchResponse.getHits()));
System.out.println("=================================");
for (SearchHit documentFields : searchResponse.getHits().getHits()) {
System.out.println(documentFields.getSourceAsMap());
}
}
到这里es的curd对应的api就展示完了,后面应该会做一个小项目的demo吧