Spring boot中使用Elasticsearch(一)

引入依赖

<properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <spring-boot.version>2.5.4</spring-boot.version>
</properties>

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
</dependencyManagement>

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>7.15.2</version>
        </dependency>

        //elasticsearch-rest-high-level-client中elasticsearch-rest-client版本不对应,需要额外导入,否则会出现有些方法使用报错
        
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-client</artifactId>
            <version>7.15.2</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>7.15.2</version>
        </dependency>
</dependencies>

创建配置文件

spring:
  application:
    name: service-search

db:
  elasticsearch:
#    根据自己的ip和端口设置,一般端口为9200,有多个用英文逗号隔开
    hostnameList: localhost:9200

创建配置类

@Configuration
public class ElasticsearchConfig {

    @Value("${db.elasticsearch.hostnameList}")
    private String hostnameList;

    //    销毁时关闭 close为自带的
    @Bean(destroyMethod = "close")
    public RestHighLevelClient restHighLevelClient() {
        String[] strings = hostnameList.split(",");
        HttpHost[] httpHost = new HttpHost[strings.length];
        for (int i = 0; i < strings.length; i++) {
            String item = strings[i];
            httpHost[i] = new HttpHost(item.split(":")[0], Integer.parseInt(item.split(":")[1]), "http");
        }
        return new RestHighLevelClient(RestClient.builder(httpHost));
    }
}

创建启动类

@SpringBootApplication
public class SearchApplication {
    public static void main(String[] args) {
        SpringApplication.run(SearchApplication.class, args);
    }
}

编写测试类

查询数据

@SpringBootTest
public class EsDemo {

    @Autowired
    private RestHighLevelClient restHighLevelClient;

    @Test
    public void getData() throws IOException {
        GetRequest getRequest = new GetRequest("book", "1");
//        条件查询的参数
        String[] includes = new String[]{"name", "description"};
        String[] excludes = Strings.EMPTY_ARRAY;
//        创建条件查询
        FetchSourceContext fetchSourceContext = new FetchSourceContext(true, includes, excludes);
//        添加条件查询参数
        getRequest.fetchSourceContext(fetchSourceContext);
        
//        执行

//        同步
        GetResponse response = restHighLevelClient.get(getRequest, RequestOptions.DEFAULT);

        System.out.println(response.getId());
        System.out.println(response.getVersion());
        System.out.println(response.getSourceAsString());

//        异步,不会阻塞线程
        ActionListener<GetResponse> listener = new ActionListener<GetResponse>() {
            @Override
            public void onResponse(GetResponse getResponse) {
                System.out.println(getResponse.getId());
                System.out.println(getResponse.getVersion());
                System.out.println(getResponse.getSourceAsString());
            }

            @Override
            public void onFailure(Exception e) {
                e.printStackTrace();
            }
        };

        restHighLevelClient.getAsync(getRequest, RequestOptions.DEFAULT, listener);
       	// 配置类中定义了close方法,因此启动延迟,方便观察数据
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

添加数据

@Test
    public void addData() throws IOException {
//        构建请求
        IndexRequest indexRequest = new IndexRequest("book", "_doc", "5");

//        方法1
//        String jsonString = "{\n" +
//                "  \"name\": \"java\",\n" +
//                "  \"description\": \"后端\",\n" +
//                "  \"timestamp\": \"2021-11-24 18:08:00\",\n" +
//                "  \"price\": 31\n" +
//                "}";
//        indexRequest.source(jsonString, XContentType.JSON);

//        方法2
//        HashMap<String, Object> hashMap = new HashMap<>();
//        hashMap.put("name", "php");
//        hashMap.put("description", "后端");
//        hashMap.put("timestamp", "2021-11-24 18:08:00");
//        hashMap.put("price", "31");
//        indexRequest.source(hashMap);

//        方法3
//        XContentBuilder jsonBuilder = XContentFactory.jsonBuilder();
//        jsonBuilder.startObject();
//        {
//            jsonBuilder.field("name", "node.js");
//            jsonBuilder.field("description", "后端");
//            jsonBuilder.field("price", "31");
//            jsonBuilder.timeField("timestamp", "2021-11-24 18:08:00");
//        }
//        jsonBuilder.endObject();
//        indexRequest.source(jsonBuilder);

//        方法4
        indexRequest.source("name", "c#", "description", "后端", "price", "31", "timestamp", "2021-11-24 18:08:00");

//        可选参数 ....
//        indexRequest.timeout(TimeValue.timeValueMillis(1));

//        同步
        IndexResponse response = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
        System.out.println(response.getId());

//        异步
        ActionListener<IndexResponse> listener = new ActionListener<IndexResponse>() {
            @Override
            public void onResponse(IndexResponse response) {
                System.out.println(response.getId());
            }

            @Override
            public void onFailure(Exception e) {
                e.printStackTrace();
            }
        };

        restHighLevelClient.indexAsync(indexRequest, RequestOptions.DEFAULT, listener);
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

更新数据

@Test
    public void upData() throws IOException {
        UpdateRequest request = new UpdateRequest("book", "4");

        HashMap<String, Object> hashMap = new HashMap<>();
        hashMap.put("name", "C++");
        request.doc(hashMap);

//        同步
        UpdateResponse response = restHighLevelClient.update(request, RequestOptions.DEFAULT);
        System.out.println(response.getId());

//        异步
        ActionListener<UpdateResponse> listener = new ActionListener<UpdateResponse>() {
            @Override
            public void onResponse(UpdateResponse response) {
                System.out.println(response.getId());
            }

            @Override
            public void onFailure(Exception e) {
                e.printStackTrace();
            }
        };

        restHighLevelClient.updateAsync(request, RequestOptions.DEFAULT, listener);
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

删除数据

@Test
    public void deleteData() throws IOException {
        DeleteRequest request = new DeleteRequest("book", "5");

//        同步
        DeleteResponse response = restHighLevelClient.delete(request, RequestOptions.DEFAULT);
        System.out.println(response.getResult());

//        异步
        ActionListener<DeleteResponse> listener = new ActionListener<DeleteResponse>() {
            @Override
            public void onResponse(DeleteResponse response) {
                System.out.println(response.getResult());
            }

            @Override
            public void onFailure(Exception e) {
                e.printStackTrace();
            }
        };
        restHighLevelClient.deleteAsync(request,RequestOptions.DEFAULT,listener);
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

批量操作

@Test
    public void bulkData() throws IOException {

        BulkRequest request = new BulkRequest();

        request.add(new IndexRequest("book").id("7").source(XContentType.JSON, "name", "c#", "description", "后端", "price", "31", "timestamp", "2021-11-24 18:08:00"));
        request.add(new UpdateRequest("book", "4").doc("name", "node"));

//        同步
        BulkResponse response = restHighLevelClient.bulk(request, RequestOptions.DEFAULT);

        for (BulkItemResponse bulkItemResponse : response) {
            DocWriteResponse responseResponse = bulkItemResponse.getResponse();
            switch (bulkItemResponse.getOpType()) {
                case INDEX:
                    System.out.println("CREATE or INDEX:" + responseResponse.getResult());
                    break;
                case CREATE:
                    System.out.println("CREATE:" + responseResponse.getResult());
                    break;
                case UPDATE:
                    System.out.println("UPDATE:" + responseResponse.getResult());
                    break;
                case DELETE:
                    System.out.println("DELETE:" + responseResponse.getResult());
                    break;
            }
        }

//        异步
        ActionListener<BulkResponse> listener = new ActionListener<BulkResponse>() {
            @Override
            public void onResponse(BulkResponse response) {
                for (BulkItemResponse bulkItemResponse : response) {
                    DocWriteResponse responseResponse = bulkItemResponse.getResponse();
                    switch (bulkItemResponse.getOpType()) {
                        case INDEX:
//                            代表创建或者全替换,个人根据测试推断
                            System.out.println("INDEX:" + responseResponse.getResult());
                            break;
                        case CREATE:
                            System.out.println("CREATE:" + responseResponse.getResult());
                            break;
                        case UPDATE:
                            System.out.println("UPDATE:" + responseResponse.getResult());
                            break;
                        case DELETE:
                            System.out.println("DELETE:" + responseResponse.getResult());
                            break;
                    }
                }
            }

            @Override
            public void onFailure(Exception e) {
                e.printStackTrace();
            }
        };

        restHighLevelClient.bulkAsync(request, RequestOptions.DEFAULT, listener);
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

本人接触后端时间不长,欢迎各位大神指教

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值