官方文档:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/index.html
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7WO11AQr-1610955801732)(C:\Users\王东梁\AppData\Roaming\Typora\typora-user-images\image-20210117234918617.png)]
创建一个模块的办法(新)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hAbuuaTh-1610955801735)(C:\Users\王东梁\AppData\Roaming\Typora\typora-user-images\image-20210117235819775.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mAtpbds5-1610955801739)(C:\Users\王东梁\AppData\Roaming\Typora\typora-user-images\image-20210118000624531.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RbhSjz3x-1610955801742)(C:\Users\王东梁\AppData\Roaming\Typora\typora-user-images\image-20210118001126961.png)]
1、找到原生的依赖
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.6.1</version>
</dependency>
<properties>
<java.version>1.8</java.version>
<elasticsearch.version>7.6.1</elasticsearch.version>
</properties>
2、找对象
Initialization
A RestHighLevelClient
instance needs a REST low-level client builder to be built as follows:
package com.kuang.config;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ElasticSearchClientConfig {
@Bean
public RestHighLevelClient restHighLevelClient(){
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost("localhost", 9200, "http"),
new HttpHost("localhost", 9201, "http")));
return client;
}
}
The high-level client will internally create the low-level client used to perform requests based on the provided builder. That low-level client maintains a pool of connections and starts some threads so you should close the high-level client when you are well and truly done with it and it will in turn close the internal low-level client to free those resources. This can be done through the close
:
client.close();
In the rest of this documentation about the Java High Level Client, the RestHighLevelClient
instance will be referenced as client
.
3、分析类中的方法
一定要版本一致!默认es是6.8.1,要改成与本地一致的。
<properties>
<java.version>1.8</java.version>
<elasticsearch.version>7.6.1</elasticsearch.version>
</properties>
Java配置类
@Configuration //xml
public class EsConfig {
@Bean
public RestHighLevelClient restHighLevelClient(){
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost("localhost", 9200, "http"))); //妈的被这个端口搞了
return client;
}
}
索引API操作
1、创建索引
@SpringBootTest
class EsApplicationTests {
@Autowired
@Qualifier("restHighLevelClient")
private RestHighLevelClient restHighLevelClient;
//创建索引的创建 Request
@Test
void testCreateIndex() throws IOException {
//1.创建索引请求
CreateIndexRequest request = new CreateIndexRequest("索引名");
//2.执行创建请求 indices 请求后获得响应
CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);
System.out.println(createIndexResponse);
}
}
2、获取索引
@Test
void testExistIndex() throws IOException {
GetIndexRequest request = new GetIndexRequest("索引名");
boolean exist =restHighLevelClient.indices().exists(request,RequestOptions.DEFAULT);
System.out.println(exist);
}
3、删除索引
@Test
void deleteIndex() throws IOException{
DeleteIndexRequest request = new DeleteIndexRequest("索引名");
AcknowledgedResponse delete = restHighLevelClient.indices().delete(request, RequestOptions.DEFAULT);
System.out.println(delete.isAcknowledged());
}
文档API操作
package com.kuang.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
public class User {
private String name;
private int age;
}
1、测试添加文档
导入
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.16</version>
</dependency>
//测试添加文档
@Test
void testAddDocument() throws IOException {
//创建对象
User user = new User("psz", 22);
IndexRequest request = new IndexRequest("ppp");
//规则 PUT /ppp/_doc/1
request.id("1");
request.timeout(timeValueSeconds(1));
//数据放入请求
IndexRequest source = request.source(JSON.toJSONString(user), XContentType.JSON);
//客户端发送请求,获取响应结果
IndexResponse indexResponse = restHighLevelClient.index(request, RequestOptions.DEFAULT);
System.out.println(indexResponse.toString());
System.out.println(indexResponse.status());
}
2、获取文档
//获取文档,判断是否存在 GET /index/doc/1
@Test
void testIsExists() throws IOException {
GetRequest getRequest = new GetRequest("ppp", "1");
//过滤,不放回_source上下文
getRequest.fetchSourceContext(new FetchSourceContext(false));
getRequest.storedFields("_none_");
boolean exists = restHighLevelClient.exists(getRequest, RequestOptions.DEFAULT);
System.out.println(exists);
}
3、获取文档信息
//获取文档信息
@Test
void getDocument() throws IOException {
GetRequest getRequest = new GetRequest("ppp", "1");
GetResponse getResponse = restHighLevelClient.get(getRequest, RequestOptions.DEFAULT);
System.out.println(getResponse.getSourceAsString());
System.out.println(getResponse);
}
==============输出==========================
{"age":22,"name":"psz"}
{"_index":"ppp","_type":"_doc","_id":"1","_version":2,"_seq_no":1,"_primary_term":1,"found":true,"_source":{"age":22,"name":"psz"}}
4、更新文档信息
//更新文档信息
@Test
void updateDocument() throws IOException {
UpdateRequest updateRequest = new UpdateRequest("ppp","1");
updateRequest.timeout("1s");
//json格式传入对象
User user=new User("新名字",21);
updateRequest.doc(JSON.toJSONString(user),XContentType.JSON);
//请求,得到响应
UpdateResponse updateResponse = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);
System.out.println(updateResponse);
}
5、删除文档信息
//删除文档信息
@Test
void deleteDocument() throws IOException {
DeleteRequest deleteRequest = new DeleteRequest("ppp","1");
deleteRequest.timeout("1s");
DeleteResponse deleteResponse = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);
System.out.println(deleteResponse);
}
批量操作Bulk
- 真实项目中,肯定用到大批量查询
- 不写id会随机生成id
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CS8wKFqS-1610955801744)(C:\Users\王东梁\AppData\Roaming\Typora\typora-user-images\image-20210118104900129.png)]
@Test
void testBulkRequest() throws IOException{
BulkRequest bulkRequest = new BulkRequest();
bulkRequest.timeout("10s");//数据量大的时候,秒数可以增加
ArrayList<User> userList = new ArrayList<>();
userList.add(new User("psz",11));
userList.add(new User("psz2",12));
userList.add(new User("psz3",13));
userList.add(new User("psz4",14));
userList.add(new User("psz5",15));
for (int i = 0; i < userList.size(); i++) {
bulkRequest.add(
new IndexRequest("ppp")
.id(""+(i+1))
.source(JSON.toJSONString(userList.get(i)),XContentType.JSON));
}
//请求+获得响应
BulkResponse bulkResponse = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
System.out.println(bulkResponse.hasFailures());//返回false:成功
}
搜索
/*
查询:
搜索请求:SearchRequest
条件构造:SearchSourceBuilder
*/
@Test
void testSearch() throws IOException {
SearchRequest searchRequest = new SearchRequest("ppp");
//构建搜索条件
SearchSourceBuilder searchSourceBuilderBuilder = new SearchSourceBuilder();
// 查询条件QueryBuilders工具
// :比如:精确查询
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", "psz");
searchSourceBuilderBuilder.query(termQueryBuilder);
//设置查询时间
searchSourceBuilderBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
//设置高亮
//searchSourceBuilderBuilder.highlighter()
searchRequest.source(searchSourceBuilderBuilder);
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
System.out.println(JSON.toJSONString(searchResponse.getHits()));
}