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);
        }
  • 相关阅读:
    如何优化代码和RAM大小
    Ubuntu14.04用apt在线/离线安装CDH5.1.2[Apache Hadoop 2.3.0]-old
    PHP和Golang使用Thrift1和Thrift2访问Hbase0.96.2(ubuntu12.04)
    Flume+Kafka+Strom基于伪分布式环境的结合使用
    Golang、Php、Python、Java基于Thrift0.9.1实现跨语言调用
    mac10.9+php5.5.15+brew0.9.5的安装
    kafka2.9.2的伪分布式集群安装和demo(java api)测试
    Flume1.5.0的安装、部署、简单应用(含伪分布式、与hadoop2.2.0、hbase0.96的案例)
    ubuntu12.04+proftpd1.3.4a的系统用户+虚拟用户权限应用实践
    ubuntu12.04+kafka2.9.2+zookeeper3.4.5的伪分布式集群安装和demo(java api)测试
  • 原文地址:https://www.cnblogs.com/gyli20170901/p/10178026.html
Copyright © 2011-2022 走看看