由于ES本质也是存储数据就跟数据库一样所以对es的操作也不外乎CRUD,也就是对照着上篇介绍中的概念 索引,文档进行CRUD的操作。当然其中的查询操作会比较复制,因为是做全文搜索的,对全文搜索的要求也自然比普通的查询要求要高
话不多说,撸起袖子开干
1.添加依赖
<dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>7.8.0</version> </dependency> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>7.8.0</version> </dependency>
2.普通的索引,文档增删查改
public class ElasticsearchIndexCrudTesting { //1.创建客户端对象 RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("192.168.68.253", 9200, "http"))); @Test void CrudIndex() throws IOException { /** 创建索引 */ //2.构造创建索引请求对象 CreateIndexRequest createIndexRequest = new CreateIndexRequest("repository"); //3.发送请求,获取请求结构并输出 CreateIndexResponse createIndexResponse = client.indices().create(createIndexRequest, RequestOptions.DEFAULT); boolean acknowledged = createIndexResponse.isAcknowledged(); System.out.println("create Index "+(acknowledged?"Success":"Fail")); /** 查询索引 */ GetIndexRequest getIndexRequest = new GetIndexRequest("repository"); GetIndexResponse getIndexResponse = client.indices().get(getIndexRequest, RequestOptions.DEFAULT); Map<String, Settings> settings = getIndexResponse.getSettings(); System.out.println(settings); /** 更新索引 */ //没有更新索引这种东西 官网也没有给出 /** 删除索引 */ DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("repository"); AcknowledgedResponse acknowledgedResponse = client.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT); System.out.println("delete Index "+(acknowledgedResponse.isAcknowledged()?"Success":"Fail")); } }
public class ElasticsearchDocumentTesting { //1.创建ES客户端 RestHighLevelClient esClient = new RestHighLevelClient(RestClient.builder(new HttpHost("192.168.68.253", 9200, "http"))); @Test void CurdDocument() throws IOException { /** 新增文档 */ //官网有流式API但我这里运行不起来 下面的例子参考自其他博客资料 //2.构造文档数据,请求对象 2.1 请求对象指定(关联)索引 关联文档数据 Product product = new Product("bk-1", "City bike", 123.0); IndexRequest indexRequest = new IndexRequest(); indexRequest.index("product").id(product.getSku()); ObjectMapper objectMapper = new ObjectMapper(); String valueAsString = objectMapper.writeValueAsString(product); indexRequest.source(valueAsString, XContentType.JSON); //3.发送请求 IndexResponse indexResponse = esClient.index(indexRequest, RequestOptions.DEFAULT); System.out.println(indexResponse.getResult()); /** 更新文档 */ //2.构造请求数据 并关联索引和数据 UpdateRequest updateRequest = new UpdateRequest(); updateRequest.index("product").id("bk-1"); updateRequest.doc(XContentType.JSON,"name","City bike plus~"); //3.发送请求 UpdateResponse updateResponse = esClient.update(updateRequest, RequestOptions.DEFAULT); System.out.println(updateResponse.getResult()); /** 查询文档 */ GetRequest getRequest = new GetRequest().index("product").id("bk-1"); GetResponse getResponse = esClient.get(getRequest, RequestOptions.DEFAULT); System.out.println(getResponse.getSourceAsString()); /** 删除文档 */ DeleteRequest deleteRequest = new DeleteRequest().index("product").id("bk-1"); DeleteResponse deleteResponse = esClient.delete(deleteRequest, RequestOptions.DEFAULT); System.out.println(deleteResponse.getResult()); } }
3.Elasticsearch复杂查询(Query DSL查询)
elasticsearch存储的是JSON这种非结构化数据,Query DSL在其中就相当于 结构化数据查询中的SQL, 这里不做Query DSL的详细介绍 其语法可以谷歌ES Query DSL和SQL的类比关系
其中ES的聚会查询其难点在于聚合查询以及后续这些NOSQL的中间间都慢慢支持SQL的结构化查询 会在后面新开一篇记录
public class ElasticsearchQueryDSLTesting { RestHighLevelClient esClient = new RestHighLevelClient(RestClient.builder(new HttpHost("192.168.68.253", 9200, "http"))); @Test void DSLMatchAllTest () throws IOException { /** 查询全部 */ //2.构建复杂查询请求对象并关联索引 SearchRequest searchRequest = new SearchRequest(); searchRequest.indices("product"); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); //3.构建查询语句(相当于代码写sql-> select * from) 并关联查询请求对象 sourceBuilder.query(QueryBuilders.matchAllQuery()); searchRequest.source(sourceBuilder); //4.发送请求 SearchResponse searchResponse = esClient.search(searchRequest, RequestOptions.DEFAULT); //5.获取结果 SearchHits hits = searchResponse.getHits(); for (SearchHit hit : hits) { System.out.println(hit.getSourceAsString()); } } @Test void DSLTermTest () throws IOException { /** 关键字查询 */ //2.构建复杂查询请求对象并关联索引 SearchRequest searchRequest = new SearchRequest(); searchRequest.indices("product"); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); //3.构建查询语句(相当于代码写sql-> select * from) 并关联查询请求对象 sourceBuilder.query(QueryBuilders.termQuery("name.keyword","Mountain bike")); searchRequest.source(sourceBuilder); //4.发送请求 SearchResponse searchResponse = esClient.search(searchRequest, RequestOptions.DEFAULT); //5.获取结果 SearchHits hits = searchResponse.getHits(); for (SearchHit hit : hits) { System.out.println(hit.getSourceAsString()); } } @Test void DSLPageTest () throws IOException { /** 分页查询 */ //2.构建复杂查询请求对象并关联索引 SearchRequest searchRequest = new SearchRequest(); searchRequest.indices("product"); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); //3.构建查询语句(相当于代码写sql-> select * from) 并关联查询请求对象 sourceBuilder.query(QueryBuilders.matchAllQuery()); //设置分页参数 sourceBuilder.from(0); sourceBuilder.size(1); searchRequest.source(sourceBuilder); //4.发送请求 SearchResponse searchResponse = esClient.search(searchRequest, RequestOptions.DEFAULT); //5.获取结果 SearchHits hits = searchResponse.getHits(); for (SearchHit hit : hits) { System.out.println(hit.getSourceAsString()); } } @Test void DSLSortTest () throws IOException { /** 排序 */ //2.构建复杂查询请求对象并关联索引 SearchRequest searchRequest = new SearchRequest(); searchRequest.indices("product"); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); //3.构建查询语句(相当于代码写sql-> select * from) 并关联查询请求对象 sourceBuilder.query(QueryBuilders.matchAllQuery()); sourceBuilder.sort("price", SortOrder.DESC); searchRequest.source(sourceBuilder); //4.发送请求 SearchResponse searchResponse = esClient.search(searchRequest, RequestOptions.DEFAULT); //5.获取结果 SearchHits hits = searchResponse.getHits(); for (SearchHit hit : hits) { System.out.println(hit.getSourceAsString()); } } @Test void DSLBoolTest () throws IOException { /** Bool查询 */ //2.构建复杂查询请求对象并关联索引 SearchRequest searchRequest = new SearchRequest(); searchRequest.indices("product"); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); //3.构建查询语句(相当于代码写sql-> select * from) 并关联查询请求对象 BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder(); boolQueryBuilder.must(QueryBuilders.termQuery("name.keyword","Mountain bike")); boolQueryBuilder.should(QueryBuilders.termQuery("sku.keyword","not a sku")); sourceBuilder.query(boolQueryBuilder); searchRequest.source(sourceBuilder); //4.发送请求 SearchResponse searchResponse = esClient.search(searchRequest, RequestOptions.DEFAULT); //5.获取结果 SearchHits hits = searchResponse.getHits(); for (SearchHit hit : hits) { System.out.println(hit.getSourceAsString()); } } }
Springboot集成Elasticsearch
参考: https://www.elastic.co/guide/en/elasticsearch/client/java-api-client/7.17/indexing.html
浙公网安备 33010602011771号