一、SpringBoot整合ElasticSearch
1.SpringBoot整合ElasticSearch
ElasticSearch SpringBoot Integration
导入依赖
Maven库
先看下官网给出的参考
以上加上SpringBoot整合ElasticSearch需要的maven依赖,通过官方文档我们可以知道其实就是这两个jar包在起作用
2.链接ES的客户端
Link to ES client
如下图:
通过RestHighLevelCilent 对象,指定链接ES地址
RestHighLevelCilent client = new RestHighLevelClient();
client.builder(new HttpHost("localhost",9200,"http"),
new HttpHost("localhost",9201,"http")
);
3.编写查询表达式 Writing Query Expressions
下图这段话的意思大概是,在用RestHighLevelClient链接后,我们可以通过RequestOpetions对象来创建ElasticSearch的表达式。
二、如何使用Java代码操作各种复杂的ES查询
1.我们大概需要学习如下的API We Probably Need To Learn The Following APIs
2.Index API
Index Request基本写法
Index Request Basic Notation
字符串写法:
IndexRequest request = new IndexRequest("posts");
request.id("1");
String jsonString = "{" +
"\"user\":\"kimchy\"," +
"\"postDate\":\"2013-01-30\"," +
"\"message\":\"trying out Elasticsearch\"" +
"}";
request.source(jsonString, XContentType.JSON);
// 以上这种写法毫无疑问很麻烦,所以一般使用另一种方法代替
Map<String, Object> jsonMap = new HashMap<>();
jsonMap.put("user", "kimchy");
jsonMap.put("postDate", new Date());
jsonMap.put("message", "trying out Elasticsearch");
IndexRequest indexRequest = new IndexRequest("posts")
.id("1").source(jsonMap);
// 文档源作为xcontentBuilder对象提供,Elasticsearch内置帮助程序生成JSON内容
XContentBuilder builder = XContentFactory.jsonBuilder();
builder.startObject();
{
builder.field("user", "kimchy");
builder.timeField("postDate", new Date());
builder.field("message", "trying out Elasticsearch");
}
builder.endObject();
IndexRequest indexRequest = new IndexRequest("posts")
.id("1").source(builder);
//文档源作为对象键对提供,它被转换为JSON格式
IndexRequest indexRequest = new IndexRequest("posts")
.id("1")
.source("user", "kimchy",
"postDate", new Date(),
"message", "trying out Elasticsearch");
以上两种方式,在没有工具类的情况下,第二种比较简易好用。阿里推出的JSON的工具也给我们带来了很多的简便,导入如下依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
在使用的时候只需要
JSON.toJSONString(对象/集合);
3.如何选择参数,参数的说明
How To Select Parameters, Parameter Description
request.routing("routing");
// 设置等待超时时间,可以有两种方式
// 1.秒值设置
request.timeout(TimeValue.timeValueSeconds(1));
// 2.字符串设置
request.timeout("1s");
4.还有很多关于参数的说明,下次我再额外的做一次说明吧。今天先说说怎么整合SpringBoot
三、idea实操SpringBoot集成ElasticSearch
Idea SpringBoot Integration With ElasticSearch
1、创建一个SpingBoot的项目
1、Create A SpingBoot Project
2、构建配置类,连接ES
2. Build Configuration Class And Connect ES
package com.esproject.demoapi.configES;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* author: wangjiulong
* date: 2021-01-17
* desc:关于elasticSearch的客户端配置
*/
@Configuration
public class ElasticSearchConfig {
// 放到spring中待用
@Bean
public RestHighLevelClient getBean(){
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost("127.0.0.1",9200,"http"))
);
return client;
}
}
3.创建索引
3. Create an index
@Autowired
@Qualifier("getBean")
private RestHighLevelClient restHighLevelClient;
// 1.测试索引的创建
@Test
void testCreateIndex() throws IOException {
// 1.创建索引
CreateIndexRequest createIndexRequest=new CreateIndexRequest("wangjiulong_index");
// 2.客户端执行请求
CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(createIndexRequest, RequestOptions.DEFAULT);
// 3.打印索引信息
System.out.println(createIndexResponse);
}
验证结果:创建之后查看下索引是否创建
4.测试索引是否存在
4. Test If The Index Exists
// 2.测试索引
@Test
void testExistIndex() throws IOException {
GetIndexRequest getIndexRequest = new GetIndexRequest("wangjiulong_index3");
boolean isExistIndex = restHighLevelClient.indices().exists(getIndexRequest,RequestOptions.DEFAULT);
System.out.println(isExistIndex);
}
验证结果:如果获取不存在的索引将会导致报错
5.删除索引
5. Remove The Index
// 3.删除索引
@Test
void testDeleteIndex() throws IOException{
DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("wangjiulong_index");
AcknowledgedResponse acknowledgedResponse = restHighLevelClient.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
System.out.println(acknowledgedResponse.isAcknowledged());
}
验证结果:删除之后查看ES是否还能检索到该索引
验证结果:删除索引后再发送删除请求会导致报错
6.添加文档
6. Add The Document
准备一个实体类
package com.esproject.demoapi.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.stereotype.Component;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
public class User {
private String name;
private int age;
}
// 4.添加文档
@Test
void testAddDocument() throws IOException {
//1.创建对象
User user = new User("wangjiulong",15);
//2.创建请求
IndexRequest indexRequest = new IndexRequest("wangjiulong_index");
//3.规则 put/wangjiulong_index/_doc/id
indexRequest.id("1");
indexRequest.timeout(TimeValue.timeValueSeconds(1));//超时设置
//4.将数据放入请求 json
indexRequest.source(JSON.toJSONString(user), XContentType.JSON);
//5.客户端发送请求
IndexResponse indexResponse = restHighLevelClient.index(indexRequest,RequestOptions.DEFAULT);
//6.查看状态
System.out.println(indexResponse.toString());
System.out.println(indexResponse.status());
}
验证结果:添加文档后查看是否能找到该文档
7.获取文档,是否存在
7. Gets The Document, Whether It Exists
//get / index/doc/1
@Test
void getDocument() throws IOException {
//1.创建请求
GetRequest getRequest = new GetRequest("wangjiulong_index","1");
//2.可以设置不获取返回的上下文
getRequest.fetchSourceContext(new FetchSourceContext(false));
getRequest.storedFields("_none_");
boolean bo = restHighLevelClient.exists(getRequest,RequestOptions.DEFAULT);
System.out.println(bo);
}
8.获取文档信息
8. Obtain Document Information
//6. 获取文档信息
@Test
void getDocumentInfo() throws IOException{
GetRequest getRequest = new GetRequest("wangjiulong_index","1");
GetResponse getResponse = restHighLevelClient.get(getRequest,RequestOptions.DEFAULT);
System.out.println(getResponse.getSourceAsString());// 打印文档内容
System.out.println(getResponse);// 打印对象
}
9.更新文档信息
9. Update Document Information
//97.更新文档信息
@Test
void updateDocument() throws IOException {
UpdateRequest updateRequest = new UpdateRequest("wangjiulong_index","1");
updateRequest.timeout("1s");// 设置超时时间
User user = new User("王九龙",10);
updateRequest.doc(JSON.toJSONString(user),XContentType.JSON);
restHighLevelClient.update(updateRequest,RequestOptions.DEFAULT);
}
验证结果:查看文档信息
10.删除文档记录
10. Delete Document Record
//8.删除文档记录
@Test
void deleteDocument() throws IOException {
DeleteRequest deleteIndexRequest = new DeleteRequest("wangjiulong_index","1");
deleteIndexRequest.timeout("1s");
DeleteResponse deleteResponse = restHighLevelClient.delete(deleteIndexRequest,RequestOptions.DEFAULT);
System.out.println(deleteResponse);
}
11.批量的插入数据
11. Batch Inserts
//9. 批量的插入数据
@Test
void addDocuments() throws IOException {//批量导入
BulkRequest bulkRequest = new BulkRequest();
bulkRequest.timeout("10s");
User user1 = new User("wang",21);
User user2 = new User("jiu",21);
User user3 = new User("long",21);
User user4 = new User("qin",21);
List<User> list = new ArrayList<>();
list.add(user1);
list.add(user2);
list.add(user3);
list.add(user4);
for(int i=0;i<list.size();i++){
bulkRequest.add(
new IndexRequest("wangjiulong_index")
.id(String.valueOf(i+1))// id不设置会自动生成,这里在实际开发中记得id的唯一性,如果不唯一,将会覆盖原有的id的document的值
.source(JSON.toJSONString(list.get(i)),XContentType.JSON)
);
}
BulkResponse bulkItemResponses = restHighLevelClient.bulk(bulkRequest,RequestOptions.DEFAULT);
System.out.println(bulkItemResponses.hasFailures());// 是否失败 false = 成功
}
12.批量查询
12. Batch Query
//10.批量查询
@Test
void searchDocuments() throws IOException {
SearchRequest searchRequest = new SearchRequest("wangjiulong_index");
//构建搜索条件
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//相当于term查询,通过QueryBuilders完成查询条件的构造
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name","qin");
// 例如匹配所有的可以这么写 : QueryBuilders.matchAllQuery();//匹配所有
searchSourceBuilder.query(termQueryBuilder);
searchSourceBuilder.timeout(TimeValue.timeValueSeconds(1));// 设置超时时间 1s
searchRequest.source(searchSourceBuilder);// 把条件丢进来
SearchResponse searchResponse = restHighLevelClient.search(searchRequest,RequestOptions.DEFAULT);
System.out.println(JSON.toJSONString(searchResponse.getHits()));
System.out.println("=-=-=-=-=-=-=-=-=-=-=-=-=-");
for(SearchHit documentFields:searchResponse.getHits().getHits()){
System.out.println(documentFields.getSourceAsString());
}
}