美文网首页
ElasticSearch CURD (step 2)

ElasticSearch CURD (step 2)

作者: jaymz明 | 来源:发表于2019-08-16 09:40 被阅读0次

    继续ELK。
    今天主要学习了下ElasticSearch的CURD。用到一个head插件,可以可视化es内部的数据。下载地址:https://github.com/mobz/elasticsearch-head
    需要注意的是为了能让它和ES进行通信,需要在设置跨域。在ES的config中添加

    http.cors.enabled:true
    http.cors.allow-origin:"*"
    

    成功启动之后,会出现以下的页面。

    image.png

    配置多集群
    在config/elasticsearch.yml文件中新增

    node.name: master
    node.master: true
    network.host:127.0.0.1
    

    这样我们就配好了集群的master节点。node 节点安装同master节点一致。区别在于在config中配置需要指定cluster.name和master一致,并且需要设置http.port以及绑定master节点:discovery.zen.ping.unicast.hosts:[127.0.0.1] 。
    索引:含有相同属性的文档集合(类似于数据库)
    类型:索引可以定义一个或者多个类型,文档必须属于一个类型(类似于表)
    文档:文档是可以被索引的基本数据单位(类似于一条记录)

    结合springboot来编写CURD

    1. 首先我们现在es中建立index:people,type为man,三个字段:name,age,date。如下图:
    put index.png
    1. 在pom中引入ES
         <dependency>
                <groupId>org.elasticsearch.client</groupId>
                <artifactId>transport</artifactId>
                <version>6.4.3</version>
            </dependency>
            <dependency>
                <groupId>org.elasticsearch</groupId>
                <artifactId>elasticsearch</artifactId>
                <version>6.4.3</version>
            </dependency>
    
    1. 编写与ES server的config。
    @Configuration
    class MyEsConfig {
        @Bean
        public TransportClient client() {
            Settings settings = Settings.builder()
                    .put("client.transport.sniff", true)
                    .put("cluster.name", "elasticsearch").build();
            TransportClient client = new PreBuiltTransportClient(settings)
                    .addTransportAddress(new TransportAddress(new InetSocketAddress("16.155.196.55", 9300)));
            return client;
        }
    }
    
    1. CURD
        @Autowired
        private TransportClient client;
    
    //read
    @GetMapping("/get/people/man")
        @ResponseBody
        public ResponseEntity get(@RequestParam(name = "id", defaultValue = "") String id) {
            if (id.isEmpty()) {
                return new ResponseEntity(HttpStatus.NOT_FOUND);
            }
            GetResponse result = this.client.prepareGet("people", "man", id).get();
            if (!result.isExists()) {
                return new ResponseEntity(HttpStatus.NOT_FOUND);
            }
            return new ResponseEntity(result.getSource(), HttpStatus.OK);
        }
    
    //add
    @PostMapping("/add/people/man")
        @ResponseBody
        public ResponseEntity add(@RequestParam(name = "name", defaultValue = "") String name,
                                  @RequestParam(name = "age", defaultValue = "") String age,
                                  @RequestParam(name = "date")
                                  @DateTimeFormat(pattern = "yyyy-MM-dd")
                                          Date date) {
            try {
                XContentBuilder content = XContentFactory.jsonBuilder()
                        .startObject()
                        .field("name", name)
                        .field("age", age)
                        .field("date", date.getTime())
                        .endObject();
                IndexResponse result = this.client.prepareIndex("people", "man").setSource(content).get();
                return new ResponseEntity(result.getId(), HttpStatus.OK);
            } catch (IOException e) {
                e.printStackTrace();
                return new ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR);
            }
    
        }
    //delete
     @DeleteMapping("/delete/people/man")
        @ResponseBody
        public ResponseEntity delete(@RequestParam(name = "id") String id) {
            DeleteResponse result = this.client.prepareDelete("people", "man", id).get();
            return new ResponseEntity(result.getResult().toString(), HttpStatus.OK);
        }
    
    //update
     @PutMapping("/update/people/man")
        @ResponseBody
        public ResponseEntity update(@RequestParam(name = "id") String id,
                                     @RequestParam(name = "name", required = false) String name,
                                     @RequestParam(name = "age", required = false) String age) {
            UpdateRequest update = new UpdateRequest("people", "man", id);
            try {
                XContentBuilder builder = XContentFactory.jsonBuilder().startObject();
                if (name != null) {
                    builder.field("name", name);
                }
                if (age != null) {
                    builder.field("age", age);
                }
                builder.endObject();
                update.doc(builder);
                UpdateResponse result = this.client.update(update).get();
                return new ResponseEntity(result.getResult().toString(), HttpStatus.OK);
            } catch (Exception e) {
                return new ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR);
            }
        }
    
    // complex query
    @PostMapping("/query/people/man")
        @ResponseBody
        public ResponseEntity query(@RequestParam(name = "name") String name,
                                    @RequestParam(name = "age") String age) {
            BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
            if (name != null) {
                boolQueryBuilder.must(QueryBuilders.matchQuery("name", name));
            }
            if (age != null) {
                boolQueryBuilder.must(QueryBuilders.matchQuery("age", age));
            }
            SearchRequestBuilder builder = this.client.prepareSearch("people").setTypes("man")
                    .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
                    .setQuery(boolQueryBuilder).setSize(10);
            SearchResponse response = builder.get();
            List<Map<String, Object>> result = new ArrayList<>();
            for (SearchHit s : response.getHits()) {
                result.add(s.getSourceAsMap());
            }
            return new ResponseEntity(result, HttpStatus.OK);
    
        }
    
    insert indexdata.png

    测试时候我们用postman来进行调试,还是挺方便的。

    springboot_query.png

    相关文章

      网友评论

          本文标题:ElasticSearch CURD (step 2)

          本文链接:https://www.haomeiwen.com/subject/yexdjctx.html