zoukankan      html  css  js  c++  java
  • spring boot 整合elasticsearch

    1.导入jar包

    <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <maven.compiler.source>1.8</maven.compiler.source>
            <maven.compiler.target>1.8</maven.compiler.target>
        </properties>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.0.2.RELEASE</version>
        </parent>
    
        <dependencies>
            <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
          </dependency>
    
            <dependency>
                <groupId>org.elasticsearch.client</groupId>
                <artifactId>transport</artifactId>
                <version>6.5.4</version>
            </dependency>
    
            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-core</artifactId>
                <version>2.7</version>
            </dependency>
        </dependencies>

     

    2.编写elasticsear远程连接配置文件

    import org.elasticsearch.client.transport.TransportClient;
    import org.elasticsearch.common.settings.Settings;
    import org.elasticsearch.common.transport.InetSocketTransportAddress;
    import org.elasticsearch.transport.client.PreBuiltTransportClient;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import java.net.InetAddress;
    
    @Configuration
    public class ElasticSearchConfig {
    
        @Bean
        public TransportClient transportClient() throws Exception{
            //此处需要使用elastic服务的tcp端口默认是9300
            InetSocketTransportAddress master = new InetSocketTransportAddress(InetAddress.getByName("192.168.30.242"), 9300);
            InetSocketTransportAddress node1 = new InetSocketTransportAddress(InetAddress.getByName("192.168.30.108"), 9300);
            InetSocketTransportAddress node2 = new InetSocketTransportAddress(InetAddress.getByName("192.168.30.82"), 9300);
    
            Settings settings = Settings.builder().put("cluster.name", "elasticCluster").build();
    
            TransportClient client = new PreBuiltTransportClient(settings);
            client.addTransportAddress(master);
            client.addTransportAddress(node1);
            client.addTransportAddress(node2);
            return client;
        }
    }

    3.实现elasticsearch的基本操作

    @RestController
    public class TestController {
    
        @Autowired
        private TransportClient transportClient;
    
        //查询
        @GetMapping(value = "/get")
        public ResponseEntity get(@RequestParam(name = "id", defaultValue = "") String id) {
    
            if (id.isEmpty()) {
                return new ResponseEntity(HttpStatus.NOT_FOUND);
            }
    
            GetResponse result = transportClient.prepareGet("book", "novel", id).get();
    
            if (!result.isExists()) {
                return new ResponseEntity(HttpStatus.NOT_FOUND);
            }
    
            return new ResponseEntity(result.getSource(), HttpStatus.OK);
        }
    
        //新增
        @PostMapping(value = "/add")
        public ResponseEntity add(@RequestParam(name = "title") String title,
                                  @RequestParam(name = "author") String author,
                                  @RequestParam(name = "word_count") int wordCount,
                                   @RequestParam(name = "publish_date")
                                  @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") String publishdate) {
    
            try {
               XContentBuilder content = XContentFactory.jsonBuilder()
                        .startObject()
                        .field("title", title)
                        .field("author", author)
                        .field("word_count", wordCount)
                        .field("publish_date", publishdate).endObject();
                IndexResponse result = transportClient.prepareIndex("book", "novel").setSource(content).get();
                return new ResponseEntity(result.getId(), HttpStatus.OK);
            } catch (IOException e) {
                e.printStackTrace();
                return new ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR);
            }
        }
    
        //删除
        @GetMapping(value = "/delete")
        public ResponseEntity delete(@RequestParam(name = "id") String id) {
            DeleteResponse result = transportClient.prepareDelete("book", "novel", id).get();
    
            return new ResponseEntity(result.getResult().toString(), HttpStatus.OK);
        }
    
        //修改
        @PostMapping(value = "/update")
        public ResponseEntity update(@RequestParam(name = "id") String id,
                                    @RequestParam(name = "title", required = false) String title,
                                    @RequestParam(name = "author", required = false) String author) {
    
            UpdateRequest updateRequest = new UpdateRequest("book", "novel", id);
    
            try {
                XContentBuilder builder = XContentFactory.jsonBuilder().startObject();
    
                if (title != null) {
                    builder.field("title", title);
                }
    
                if (author != null) {
                    builder.field("author", author);
                }
                builder.endObject();
                updateRequest.doc(builder);
    
                UpdateResponse result = transportClient.update(updateRequest).get();
                return new ResponseEntity(result.getResult().toString(), HttpStatus.OK);
            } catch (Exception e) {
                return new ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR);
            }
        }
    
        //复核查询
        @PostMapping(value = "/query")
        public ResponseEntity query(@RequestParam(name = "author", required = false) String author,
                                    @RequestParam(name = "title", required = false) String title,
                                    @RequestParam(name = "gt_word_count", required = false) Integer gtWordCount,
                                    @RequestParam(name = "lt_word_count", required = false) Integer ltWordCount) {
            BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
    
            if (author != null) {
                boolQueryBuilder.must(QueryBuilders.matchQuery("author", author));
            }
    
            if (title != null) {
                boolQueryBuilder.must(QueryBuilders.matchQuery("title", title));
            }
    
            RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("word_count").from(gtWordCount);
            if (ltWordCount != null && ltWordCount > 0) {
                rangeQueryBuilder.to(ltWordCount);
            }
    
            boolQueryBuilder.filter(rangeQueryBuilder);
    
            SearchRequestBuilder builder = transportClient.prepareSearch("book")
                    .setTypes("novel")
                    .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
                    .setQuery(boolQueryBuilder)
                    .setFrom(0)
                    .setSize(10);
    
            System.out.println(builder);
    
            SearchResponse response = builder.get();
            List<Map<String, Object>> result = new ArrayList<>();
    
            for (SearchHit hit : response.getHits()) {
                result.add(hit.getSource());
            }
    
            return new ResponseEntity(result, HttpStatus.OK);
        }
  • 相关阅读:
    C语言 · 字符串输入输出函数
    C语言 · 判定字符位置
    剑指offer二之替换空格
    剑指offer一之二维数组中的查找
    算法复杂度:时间复杂度与空间复杂度
    二分查找法
    信息熵
    K-means算法的原理、优缺点及改进(转)
    office2013安装与卸载
    Deep Learning (中文版&英文版)
  • 原文地址:https://www.cnblogs.com/gyli20170901/p/10178026.html
Copyright © 2011-2022 走看看