一、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()); } } }