zoukankan      html  css  js  c++  java
  • Elastic Stack:Java客户端连接ElasticSearch

    一.pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <parent>
            <artifactId>elasticsearch</artifactId>
            <groupId>com.wj</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>ESDemo</artifactId>
    
        <dependencies>
            <!-- https://mvnrepository.com/artifact/org.elasticsearch.client/elasticsearch-rest-high-level-client -->
            <dependency>
                <groupId>org.elasticsearch.client</groupId>
                <artifactId>elasticsearch-rest-high-level-client</artifactId>
                <version>7.7.1</version>
                <exclusions>
                    <exclusion>
                        <groupId>org.elasticsearch</groupId>
                        <artifactId>elasticsearch</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.elasticsearch/elasticsearch -->
            <dependency>
                <groupId>org.elasticsearch</groupId>
                <artifactId>elasticsearch</artifactId>
                <version>7.7.1</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-test -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <version>2.3.0.RELEASE</version>
                <scope>test</scope>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
                <version>2.3.0.RELEASE</version>
            </dependency>
        </dependencies>
    </project>

     二.基本步骤

    public class TestDemo {
        public static void main(String[] args) throws IOException {
            //获取连接客户端
            RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("192.168.10.138", 9200, "http")));
            //构建请求
            GetRequest request = new GetRequest("book", "1");
            //执行
            GetResponse fields = client.get(request, RequestOptions.DEFAULT);
            //获取结果
            System.out.println(fields.getId());
            System.out.println(fields.getSource());
        }
    }
    

     执行结果:

    三.使用springboot测试

    配置文件 application.yml:

    spring:
      application:
        name: search-service
    test:
      elasticsearch:
        address: 192.168.10.138
        port: 9200
    

     配置类:

    @Configuration
    public class EsConfig {
    
        @Value("${test.elasticsearch.address}")
        private String address;
    
        @Value("${test.elasticsearch.port}")
        private Integer port;
    
        @Bean(destroyMethod = "close")
        public RestHighLevelClient restHighLevelClient(){
            return new RestHighLevelClient(RestClient.builder(new HttpHost(address, port, "http")));
        }
    
    }
    

     测试类:

    @SpringBootTest(classes = SearchApplication.class)
    @RunWith(SpringRunner.class)
    public class TestDocument {
    
        @Qualifier("restHighLevelClient")
        @Autowired
        RestHighLevelClient client;
    
        @Test
        public void  test() throws IOException, InterruptedException {
            //构建请求
            GetRequest request = new GetRequest("book", "1");
            //设置可选参数
            FetchSourceContext context = new FetchSourceContext(true, new String[]{"name", "price"}, Strings.EMPTY_ARRAY);
            request.fetchSourceContext(context);
            //同步执行
            //GetResponse fields = client.get(request, RequestOptions.DEFAULT);
    
            //异步执行
            client.getAsync(request, RequestOptions.DEFAULT, new ActionListener<>() {
                //成功时的操作
                @Override
                public void onResponse(GetResponse documentFields) {
                    //获取结果
                    System.out.println(documentFields.getId());
                    System.out.println(documentFields.getSource());
                    System.out.println(documentFields.getSourceAsString());
                    System.out.println(documentFields.getSourceAsMap());
                    System.out.println(new String(documentFields.getSourceAsBytes()));
                }
                //失败的操作
                @Override
                public void onFailure(Exception e) {
                    e.printStackTrace();
                }
            });
            Thread.sleep(5000);
        }
    }

     查询结果:

    四.测试文档新增

    构建文档数据的四种方法:

    直接使用json字符串构建:

            //构建请求
            IndexRequest request = new IndexRequest("test_add");
            request.id("2");
            //构建文档数据
            //方法1:直接写json字符串
            String jsonStr = "{
    " +
                    "    "name": "php",
    " +
                    "    "description": "php是世界上最好的语言",
    " +
                    "    "studymodel": "201002",
    " +
                    "    "price":38.6,
    " +
                    "    "timestamp":"2019-08-25 19:11:35",
    " +
                    "    "tags": [ "php", "开发"]
    " +
                    "}";
            request.source(jsonStr, XContentType.JSON);
            //设置超时时间
            request.timeout(TimeValue.timeValueSeconds(2L));
            //手动维护版本号
            request.version(2);
            request.versionType(VersionType.EXTERNAL);
            //执行
            IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT);
            System.out.println(indexResponse.getIndex());
            System.out.println(indexResponse.getId());
            System.out.println(indexResponse.getResult());
    

     运行结果:

     使用map构建:

            Map<String, Object> map = new HashMap<>();
            map.put("user","john");
            map.put("age","18");
            map.put("time","2020-12-12");
            request.source(map);
    

     使用XContentBuilder构建:

    XContentBuilder builder = XContentFactory.jsonBuilder().startObject();
            {
                builder.field("user","john");
                builder.field("age",18);
                builder.timeField("time","2020-12-12");
            }
            builder.endObject();
            request.source(builder);
    

     直接在request中构建:

    request.source("user","john").source("age","18").source("time","2020-12-12");
    

     异步:

            Cancellable cancellable = client.indexAsync(request, RequestOptions.DEFAULT, new ActionListener<>() {
                @Override
                public void onResponse(IndexResponse indexResponse) {
                    System.out.println(indexResponse.getIndex());
                    System.out.println(indexResponse.getId());
                    System.out.println(indexResponse.getResult());
                }
    
                @Override
                public void onFailure(Exception e) {
                    e.printStackTrace();
                }
            });
    

     也可以进行更新操作:

           //构建请求
            IndexRequest request = new IndexRequest("test_add");
            request.id("4");
            //构建文档数据
            Map<String, Object> map = new HashMap<>();
            map.put("user","john");
            map.put("age","19");
            map.put("time","2020-12-12");
            request.source(map);
            //设置超时时间
            request.timeout(TimeValue.timeValueSeconds(2L));
            //手动维护版本号
            request.version(3);
            request.versionType(VersionType.EXTERNAL);
            //执行
            //IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT);
            Cancellable cancellable = client.indexAsync(request, RequestOptions.DEFAULT, new ActionListener<>() {
                @Override
                public void onResponse(IndexResponse indexResponse) {
                    System.out.println(indexResponse.getIndex());
                    System.out.println(indexResponse.getId());
                    System.out.println(indexResponse.getResult());
                    if(indexResponse.getResult()== DocWriteResponse.Result.CREATED){
                        DocWriteResponse.Result result = indexResponse.getResult();
                        System.out.println(result);
                    }else if(indexResponse.getResult()== DocWriteResponse.Result.UPDATED){
                        DocWriteResponse.Result result = indexResponse.getResult();
                        System.out.println(result);
                    }
                }
    
                @Override
                public void onFailure(Exception e) {
                    e.printStackTrace();
                }
            });
            Thread.sleep(5000);
    

    对结果进行监控:

                    ReplicationResponse.ShardInfo shardInfo = indexResponse.getShardInfo();
                    if(shardInfo.getTotal()!=shardInfo.getSuccessful()){
                        System.out.println(shardInfo.getSuccessful());
                        System.out.println(shardInfo.getTotal());
                        System.out.println("处理成功的分片少于总分片");
                    }
                    if(shardInfo.getFailed()>0){
                        for (ReplicationResponse.ShardInfo.Failure failure : shardInfo.getFailures()) {
                            System.out.println(failure.reason());
                        }
                    }
    

     五.测试修改:

            //创建请求
            UpdateRequest request = new UpdateRequest("test_add","3");
            Map<String, Object> map = new HashMap<>();
            map.put("age","33");
            request.doc(map);
            //设置重试次数
            request.retryOnConflict(4);
            //执行
            UpdateResponse response = client.update(request, RequestOptions.DEFAULT);
            //获取结果
            System.out.println(response.getId());
            System.out.println(response.getResult());
    

     六.测试删除

            DeleteRequest request = new DeleteRequest("test_add", "3");
            DeleteResponse response = client.delete(request, RequestOptions.DEFAULT);
            System.out.println(response.getId());
            System.out.println(response.getResult());
    

     七.测试bulk批量操作

            BulkRequest request = new BulkRequest();
            request.add(new IndexRequest("test_add").id("6").source(XContentType.JSON,"address","3"));
            request.add(new DeleteRequest("test_add").id("4"));
            BulkResponse responses = client.bulk(request, RequestOptions.DEFAULT);
            for (BulkItemResponse respons : responses) {
                DocWriteResponse response = respons.getResponse();
                switch (respons.getOpType()){
                    case INDEX:
                        System.out.println(response);
                    case DELETE:
                        System.out.println(response);
                }
            }
  • 相关阅读:
    [转]Windows visio2019破解激活
    KMP模式匹配算法
    【蓝桥杯2016_C++】t3:方格填数
    【蓝桥杯2015_C++】t4:格子中输出
    【蓝桥杯2015_C++】t3:奇妙的数字
    【蓝桥杯2014_C++】t6:扑克序列
    【蓝桥杯2014_C++】t4:史丰收速算
    【蓝桥杯2014_C++】t3:神奇算式
    【蓝桥杯2017_C++】t1:迷宫
    【蓝桥杯】买不到的数目
  • 原文地址:https://www.cnblogs.com/wwjj4811/p/13068118.html
Copyright © 2011-2022 走看看