SpringBoot整合ES

发布时间:2024年01月14日

1.引入依赖

<dependency>
? ? <groupId>org.springframework.boot</groupId>
? ? <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
? ? <version>2.6.3</version>
</dependency>

2.config配置文件

@Configuration
public class RestClientConfig extends AbstractElasticsearchConfiguration {

    @Override
    @Bean
    public RestHighLevelClient elasticsearchClient() {
        final ClientConfiguration clientConfiguration =ClientConfiguration.builder()
                .connectedTo("xx.xxx.xxx.xx:9200") //地址
                .build();
        return RestClients.create(clientConfiguration).rest();
    }
}

?????????会返回两个客户端对象,分别是ElasticsearchOperations和RestHighLevelClient(更推荐使用)。前者是通过面向对象的形式来操作的,后者是通过客户端的方式操作的。

3.索引相关操作

/*
    索引相关操作
 */
public class Test1 {

    RestHighLevelClient restHighLevelClient;

    @Before
    public void init(){
        final ClientConfiguration clientConfiguration =ClientConfiguration.builder()
                .connectedTo("xx.xxxx.xxx.xx:xxxx")
                .build();
        this.restHighLevelClient = RestClients.create(clientConfiguration).rest();
    }

    @Test//创建索引
    public void createIndex() throws IOException {
        CreateIndexRequest createIndexRequest = new CreateIndexRequest("products");
        //指定映射 参数1:指定映射json结构 参数2:指定数据类型
        createIndexRequest.mapping("{\n" +
                "    \"properties\": {\n" +
                "        \"id\":{\n" +
                "          \"type\":\"integer\"\n" +
                "        },\n" +
                "        \"title\":{\n" +
                "          \"type\":\"keyword\"\n" +
                "        },\n" +
                "        \"price\":{\n" +
                "          \"type\":\"double\"\n" +
                "        },\n" +
                "        \"created_at\":{\n" +
                "          \"type\":\"date\"\n" +
                "        },\n" +
                "        \"description\":{\n" +
                "          \"type\":\"text\",\n" +
                "          \"analyzer\": \"ik_max_word\"\n" +
                "        }\n" +
                "    }\n" +
                "  }", XContentType.JSON);
        //参数1:创建索引请求对象  参数2:请求配置对象
        CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(createIndexRequest, RequestOptions.DEFAULT);
        System.out.println("创建状态:"+createIndexResponse.isAcknowledged()); //打印返回信息
        restHighLevelClient.close(); //关闭资源
    }

    @Test//删除索引
    public void deleteIndex() throws IOException {
        AcknowledgedResponse acknowledgedResponse = restHighLevelClient.indices().delete(new DeleteIndexRequest("products"), RequestOptions.DEFAULT);
        System.out.println("删除状态:"+acknowledgedResponse.isAcknowledged()); //打印返回信息
        restHighLevelClient.close(); //关闭资源
    }
}

4.文档相关操作

/*
    文档相关操作(document)
 */
public class Test2 {
    RestHighLevelClient restHighLevelClient;

    @Before
    public void init(){
        final ClientConfiguration clientConfiguration =ClientConfiguration.builder()
                .connectedTo("xx.xxx.xxx.xx:9200")
                .build();
        this.restHighLevelClient = RestClients.create(clientConfiguration).rest();
    }

    @Test  //创建文档
    public void createDoc() throws IOException {
        IndexRequest indexRequest = new IndexRequest("products");
        indexRequest.id("2") //手动指定文档的id,如果不指定则会用uuid
                    .source("{\n" +
                            "  \"title\":\"瑞星咖啡\",\n" +
                            "  \"price\": 9.8,\n" +
                            "  \"created_at\":\"2023-11-18\",\n" +
                            "  \"description\":\"瑞星咖啡我最爱了,好喝\"\n" +
                            "}", XContentType.JSON);
        //参数1:索引请求对象,参数2:请求配置对象
        IndexResponse indexResponse = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
        System.out.println(indexResponse.status());
        restHighLevelClient.close();
    }

    @Test  //修改文档
    public void updateDoc() throws IOException {
        UpdateRequest updateRequest = new UpdateRequest("products","1");
        updateRequest.doc("{\n" +
                "    \"title\":\"库迪咖啡非\"\n" +
                "  }",XContentType.JSON);
        //参数1:索引请求对象,参数2:请求配置对象
        UpdateResponse updateResponse = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);
        System.out.println(updateResponse.status());
        restHighLevelClient.close();
    }

    @Test  //删除文档
    public void deleteDoc() throws IOException {
        DeleteRequest deleteRequest = new DeleteRequest("products","2");
        //参数1:索引请求对象,参数2:请求配置对象
        DeleteResponse deleteResponse = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);
        System.out.println(deleteResponse.status());
        restHighLevelClient.close();
    }

    @Test  //基于id查询文档
    public void searchDocById() throws IOException {
        GetRequest getRequest = new GetRequest("products", "1");
        GetResponse getResponse = restHighLevelClient.get(getRequest, RequestOptions.DEFAULT);
        System.out.println(getResponse.getId());
        System.out.println(getResponse.getSourceAsString());
    }

}

5.高级查询

public class Test3 {
    RestHighLevelClient restHighLevelClient;

    @Before
    public void init(){
        final ClientConfiguration clientConfiguration =ClientConfiguration.builder()
                .connectedTo("xx.xxx.xxx.xx:9200")
                .build();
        this.restHighLevelClient = RestClients.create(clientConfiguration).rest();
    }

    @Test //查询一个索引中的所有文档
    public void searchAll() throws IOException {
        SearchRequest searchRequest = new SearchRequest("products");
        searchRequest.source(new SearchSourceBuilder().query(QueryBuilders.matchAllQuery()));//查询所有
        //参数1:搜索请求对象 参数2:请求配置对象
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        System.out.println("查询出来的总条数:"+searchResponse.getHits().getTotalHits().value);
        System.out.println("查询出来的最大得分"+searchResponse.getHits().getMaxScore());
        //拿到数据结果
        SearchHit[] hits = searchResponse.getHits().getHits();
        for(SearchHit hit:hits){
            String id = hit.getId();
            System.out.println("id: "+id+" source: "+hit.getSourceAsString());
        }
    }


    @Test //基于关键词查询
    public void search() throws IOException {
        SearchRequest searchRequest = new SearchRequest("products");
        searchRequest.source(new SearchSourceBuilder().query(QueryBuilders.termQuery("description","好喝")));//查询所有
        //参数1:搜索请求对象 参数2:请求配置对象
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        System.out.println("查询出来的总条数:"+searchResponse.getHits().getTotalHits().value);
        System.out.println("查询出来的最大得分"+searchResponse.getHits().getMaxScore());
        //拿到数据结果
        SearchHit[] hits = searchResponse.getHits().getHits();
        for(SearchHit hit:hits){
            String id = hit.getId();
            System.out.println("id: "+id+" source: "+hit.getSourceAsString());
        }
    }

    /*
     * 分页查询
     * 排序
     * 字段
     */
    @Test //分页查询 与排序
    public void search2() throws IOException {
        SearchRequest searchRequest = new SearchRequest("products");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.matchAllQuery())
                            .from(1) //起始位置 start=(page-1)*size
                            .size(1) //每页显示条数
                            .sort("price", SortOrder.ASC) //字段排序
                            .fetchSource(new String[]{},new String[]{"created_at"}); //参数1:包含字段数组  参数2:排除字段数组
        searchRequest.source(searchSourceBuilder);//查询所有
        //参数1:搜索请求对象 参数2:请求配置对象
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        System.out.println("查询出来的总条数:"+searchResponse.getHits().getTotalHits().value);
        System.out.println("查询出来的最大得分"+searchResponse.getHits().getMaxScore());
        //拿到数据结果
        SearchHit[] hits = searchResponse.getHits().getHits();
        for(SearchHit hit:hits){
            String id = hit.getId();
            System.out.println("id: "+id+" source: "+hit.getSourceAsString());
        }
    }

    @Test //高亮
    public void search3() throws IOException {
        SearchRequest searchRequest = new SearchRequest("products");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        highlightBuilder.requireFieldMatch(false).field("description").field("title").preTags("<span style='color:red;'>").postTags("</span>");
        searchSourceBuilder.query(QueryBuilders.termQuery("description","好喝"))
                            .highlighter(highlightBuilder);
        searchRequest.source(searchSourceBuilder);//查询所有
        //参数1:搜索请求对象 参数2:请求配置对象
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        System.out.println("查询出来的总条数:"+searchResponse.getHits().getTotalHits().value);
        System.out.println("查询出来的最大得分"+searchResponse.getHits().getMaxScore());
        //拿到数据结果
        SearchHit[] hits = searchResponse.getHits().getHits();
        for(SearchHit hit:hits){
            System.out.println("id: "+hit.getId()+" source: "+hit.getSourceAsString());
            //获取高亮字段
            Map<String, HighlightField> highlightFields = hit.getHighlightFields();
            if(highlightFields.containsKey("description")){
                System.out.println("description高亮结果: "+highlightFields.get("description").fragments()[0]);
            }
            if(highlightFields.containsKey("title")){
                System.out.println("title高亮结果: "+highlightFields.get("title").fragments()[0]);
            }
        }
    }


    @Test //过滤查询
    public void search4() throws IOException {
        SearchRequest searchRequest = new SearchRequest("products");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.matchAllQuery())
                           .postFilter(QueryBuilders.idsQuery().addIds("1")); //指定过滤条件
        searchRequest.source(searchSourceBuilder);//查询所有
        //参数1:搜索请求对象 参数2:请求配置对象
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        System.out.println("查询出来的总条数:"+searchResponse.getHits().getTotalHits().value);
        System.out.println("查询出来的最大得分"+searchResponse.getHits().getMaxScore());
        //拿到数据结果
        SearchHit[] hits = searchResponse.getHits().getHits();
        for(SearchHit hit:hits){
            String id = hit.getId();
            System.out.println("id: "+id+" source: "+hit.getSourceAsString());
        }
    }
}

文章来源:https://blog.csdn.net/m0_62565675/article/details/135583784
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。