本文是基于springBoot的elasticsearch入门demo,主要包含:
(1)索引的增删改查
(2)文档的增删改查
先看项目结构:
1.创建maven工程,pom.xml文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.qxf</groupId>
<artifactId>elasticsearch-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>elasticsearch-api</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<elasticsearch.version>7.7.1</elasticsearch.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.59</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
这里有两个需要注意的地方:
(1)springBoot的版本,这里是2.2.6.RELEASE
(2)elasticsearch的版本,这里是7.7.1
2.添加配置类,提供 RestHighLevelClient
@Configuration
public class ElasticSearchConfig {
@Bean
public RestHighLevelClient restHighLevelClient(){
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost",9200,"http"))
);
return client;
}
}
3. 添加实体类,主要是为了测试
public class User {
private String name;
private Integer age;
public User() {
}
public User(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
4.编写测试
@SpringBootTest
public class ESApiTest {
@Autowired
RestHighLevelClient restHighLevelClient;
// 创建索引
@Test
public void testCreateIndex() throws IOException {
// 创建索引请求
CreateIndexRequest request = new CreateIndexRequest("test_index");
// 执行创建索引请求
CreateIndexResponse response = restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);
}
@Test
void testIndexExists() throws IOException {
// 判断索引是否存在
GetIndexRequest getIndexRequest = new GetIndexRequest("test_index");
boolean exists = restHighLevelClient.indices().exists(getIndexRequest, RequestOptions.DEFAULT);
System.out.println("索引test_index是否存在? "+exists);
}
@Test
void testDeleteIndex() throws IOException {
// 删除索引
DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("test_index");
AcknowledgedResponse response = restHighLevelClient.indices()
.delete(deleteIndexRequest, RequestOptions.DEFAULT);
System.out.println("索引test_index是否删除成功? "+response.isAcknowledged());
}
// 创建文档
@Test
void testCreateDocument() throws IOException {
User user = new User("张三",22);
// 创建请求
IndexRequest indexRequest = new IndexRequest("test_index");
// 设置文档id
indexRequest.id("123");
// 放入数据
indexRequest.source(JSON.toJSONString(user), XContentType.JSON);
// 客户端发送请求,获得响应结果
IndexResponse indexResponse = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
System.out.println("响应结果 "+indexResponse.toString());
System.out.println("状态 "+indexResponse.status());
}
// 获取文档
@Test
void testGetDocument() throws IOException {
GetRequest getRequest = new GetRequest("test_index", "123");
// 不获取 _source 返回的上下文,效率会更高
// getRequest.fetchSourceContext(new FetchSourceContext(false));
// getRequest.storedFields("_none_");
boolean exists = restHighLevelClient.exists(getRequest, RequestOptions.DEFAULT);
System.out.println("文档是否存在? "+exists);
if (exists){
GetResponse response = restHighLevelClient.get(getRequest, RequestOptions.DEFAULT);
System.out.println("获取文档内容 "+response.getSourceAsString());
// System.out.println("获取文档 "+response);
}
}
// 更新文档
@Test
void testUpdateDocument() throws IOException {
UpdateRequest updateRequest = new UpdateRequest("test_index", "123");
User user = new User("李四", 24);
updateRequest.doc(JSON.toJSONString(user), XContentType.JSON);
UpdateResponse update = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);
System.out.println("更新? "+update.status());
}
// 删除文档
@Test
void testDeleteDocument() throws IOException {
DeleteRequest deleteRequest = new DeleteRequest("test_index", "123");
DeleteResponse response = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);
System.out.println("删除? "+response.status());
}
// 批量插入
@Test
void testBulkAddDocument() throws IOException {
BulkRequest bulkRequest = new BulkRequest();
bulkRequest.timeout("10s");
ArrayList<User> userList = new ArrayList<>(3);
userList.add(new User("张三1",21));
userList.add(new User("张三2",22));
userList.add(new User("张三3",23));
for (int i=0;i<userList.size();i++){
bulkRequest.add(new IndexRequest("test_index")
.id(""+(i+1))
.source(JSON.toJSONString(userList.get(i)),XContentType.JSON)
);
}
BulkResponse responses = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
System.out.println("是否失败? "+responses.hasFailures());
}
// 查询
@Test
void testSearch() throws IOException {
SearchRequest searchRequest = new SearchRequest("test_index");
// 构建搜索条件
SearchSourceBuilder builder = new SearchSourceBuilder();
// 查询条件
// QueryBuilders.termQuery 精确查询
TermQueryBuilder termBuilder = QueryBuilders.termQuery("name", "张三");
MatchQueryBuilder queryBuilder = QueryBuilders.matchQuery("name", "张三");
// builder.from(0);
// builder.size(10);
builder.query(queryBuilder);
searchRequest.source(builder);
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("for循环获取 "+documentFields.getSourceAsMap());
}
}
}