一、SpringBoot整合ES数据库
1、配置原生的依赖。
<properties>
<java.version>1.8</java.version>
<!-- 自己定义es版本依赖,保证和本地- -致-->
<elasticsearch.version>7.6.2</elasticsearch.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.75</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- JODA Time -->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.10.5</version>
</dependency>
<!-- ELasticsearch -->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>7.6.2</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<!-- required by elasticsearch -->
<groupId>org.elasticsearch.plugin</groupId>
<artifactId>transport-netty4-client</artifactId>
<version>7.6.2</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<version>2.3.3.RELEASE</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
2、构建对象。
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost("localhost", 9200, "http"),
new HttpHost("localhost", 9201, "http")));
//记得关闭
client.close();
3、分析对应的方法。
@Controller 控制器(注入服务)
用于标注控制层,相当于struts中的action层
@Service 服务(注入dao)
用于标注服务层,主要用来进行业务的逻辑处理
@Repository(实现dao访问)
用于标注数据访问层,也可以说用于标注数据访问组件,即DAO组件
@Component (把普通pojo实例化到spring容器中,相当于配置文件中的 )
泛指各种组件,就是说当我们的类不属于各种归类的时候(不属于@Controller、@Services等的时候),我们就可以使用@Component来标注这个类。• @Data : 注解在类上, 为类提供读写属性, 此外还提供了 equals()、hashCode()、toString() 方法
• @Getter/@Setter : 注解在类上, 为类提供读写属性
• @ToString : 注解在类上, 为类提供 toString() 方法
• @Slf4j : 注解在类上, 为类提供一个属性名为 log 的 log4j 的日志对象
• @Log4j : 注解在类上, 为类提供一个属性名为 log 的 log4j 的日志对象
- 3、构建实体类和测试类
//User类
@Data
@Component
public class User {
private String name;
private int age;
public User() {
}
public User(String name, int age) {
this.name = name;
this.age = age;
}
}
//测试程序
package com.www.es.springboot.demo;
import com.alibaba.fastjson.JSON;
import com.www.es.springboot.demo.pojo.User;
import com.www.es.springboot.demo.utils.ESconst;
import org.elasticsearch.action.DocWriteRequest;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.CreateIndexResponse;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.MatchAllQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.TermQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.FetchSourceContext;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.concurrent.TimeUnit;
@SpringBootTest
class DemoApplicationTests {
@Autowired
private RestHighLevelClient restHighLevelClient;
//面向对象来操作
@Autowired
@Qualifier("restHighLevelClient" )
private RestHighLevelClient client;
//测试索引的创建Request
@Test
void testCreateIndex() throws IOException {
// 1、创建索引请求
CreateIndexRequest request = new CreateIndexRequest("index1" );
// 2、客户端执行请求IndicesClient,请求后获得响应
CreateIndexResponse createIndexResponse =
client.indices().create(request, RequestOptions.DEFAULT);
System.out.println(createIndexResponse);
}
//测试获取索引
@Test
void testExistIndex() throws IOException {
GetIndexRequest request = new GetIndexRequest( "index");
boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
System.out.println(exists);
}
//测试删除索引
@Test
void testDeleteIndex() throws IOException {
DeleteIndexRequest request = new DeleteIndexRequest("index1");
//删尉
AcknowledgedResponse delete = client.indices().delete(request, RequestOptions.DEFAULT);
System.out.println(delete.isAcknowledged());
}
//测试添加文档
@Test
void testAddDocument() throws IOException {
User user = new User("唐三藏",25);
//创建请求
IndexRequest indexRequest = new IndexRequest("index");
indexRequest.id("1");
indexRequest.timeout(TimeValue.timeValueSeconds(1));
indexRequest.timeout("1s");
//将我们的数据放入请求
indexRequest.source(JSON.toJSONString(user), XContentType.JSON);
//客户端发送请求
IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);
//获取响应的结果
System.out.println(indexResponse.toString());
System.out.println(indexResponse.status());
}
//获取文档,判断是否存在get /index/doc/
@Test
void testIsExists() throws IOException {
GetRequest getRequest = new GetRequest( "index", "1");
//不获取返回的_ source 的上下文了
//getRequest.fetchSourceContext (new FetchSourceContext(false));
//getRequest.storedFields("_none_");
boolean exists = client.exists(getRequest, RequestOptions.DEFAULT);
System.out.println(exists);
GetResponse getResponse = client.get(getRequest,RequestOptions.DEFAULT);
System.out.println(getResponse .getSourceAsString()); //打印文档的内容
System.out.println(getResponse);
}
//获取文档的信息
@Test
void testGetDocuments() throws IOException {
GetRequest getRequest = new GetRequest( "index", "1");
GetResponse getResponse = client.get(getRequest,RequestOptions.DEFAULT);
System.out.println(getResponse.getSourceAsString()); //打印文档的内容
System.out.println(getResponse);
}
//更新文档的信息
@Test
void testUpdateDocuments() throws IOException {
UpdateRequest updateRequest = new UpdateRequest("index", "2");
updateRequest.timeout("1s");
User user = new User("杀阡陌", 18);
UpdateRequest doc = updateRequest.doc(JSON.toJSONString(user), XContentType.JSON);
UpdateResponse updateResponse = client.update(updateRequest, RequestOptions.DEFAULT);
System.out.println(doc);
System.out.println(updateResponse.status());
System.out.println(updateResponse);
}
//删除文档信息
@Test
void testDeleteDocuments() throws IOException {
DeleteRequest deleteRequest = new DeleteRequest("index", "2");
deleteRequest.timeout("1s");
DeleteResponse deleteResponse = client.delete(deleteRequest, RequestOptions.DEFAULT);
System.out.println(deleteResponse.status());
System.out.println(deleteRequest);
}
// 特殊的,真的项目一般都会批量插入数据!
@Test
void testBulkRequest() throws IOException {
BulkRequest bulkRequest = new BulkRequest();
bulkRequest.timeout("10s");
ArrayList<User> userList = new ArrayList<>();
userList.add(new User("木sd1",3));
userList.add(new User("木s2",4));
userList.add(new User("木d3",5));
userList.add(new User("木e4",6));
userList.add(new User("木m5",7));
userList.add(new User("木g6",8));
userList.add(new User("木x7",9));
// 用下迭代器
/*for(int i = 0 ; i < userList.size();i++){
bulkRequest.add(
new IndexRequest("index")
.id(""+(i+1))
.source(JSON.toJSONString(userList.get(i)), XContentType.JSON));
}*/
for(Iterator<User> user = userList.iterator(); user.hasNext();){
System.out.println(user);
/*System.out.println(user.next().getClass().getName());
System.out.println(user.next());*/
bulkRequest.add(
new IndexRequest("index")
.source(JSON.toJSONString(user.next()), XContentType.JSON));
}
BulkResponse bulkItemResponses = client.bulk(bulkRequest, RequestOptions.DEFAULT);
System.out.println(bulkItemResponses.hasFailures());
}
// 搜索查询
// SearchRequest搜索请求
// SearchSourceBuiLder条件构造
// HighlightBuiLder构建高亮
// TermQueryBuilder精确查询
// MatchAlLQueryBuiLder
// xxx QueryBuilder对应我们刚才看到的命令!
@Test
void testSearch() throws IOException {
SearchRequest searchRequest = new SearchRequest(ESconst.ES_DATA_INDEX);
//构建搜索条件
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
final HighlightBuilder highlightBuilder = new HighlightBuilder();
SearchSourceBuilder highlighter = sourceBuilder.highlighter(highlightBuilder);
System.out.println(highlighter);
// 查询条件,我们可以使用 QueryBuilders 工具来实现
// QueryBuilders.termQuery精确
// QueryBuilders.matchAllQuery()匹配所有
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("age", "3");
MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();
//sourceBuilder.query(termQueryBuilder);
sourceBuilder.query(matchAllQueryBuilder);
searchRequest.source(sourceBuilder);
sourceBuilder.timeout(new TimeValue(120, TimeUnit.SECONDS));
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
System.out.println(JSON.toJSONString(searchResponse.getHits().getHits()));
System.out.println("=========================");
for(SearchHit documentFields:searchResponse.getHits().getHits()){
System.out.println(documentFields.getSourceAsMap());
}
}
}