由于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

posted on 2023-04-10 21:22  霸王的笔尖  阅读(52)  评论(0)    收藏  举报