SpringBoot整合Elasticsearch并实现CRUD操作

 配置准备

在build.gradle文件中添加如下依赖:

  compile "org.elasticsearch.client:transport:5.5.2"
  compile "org.elasticsearch:elasticsearch:5.5.2"
  //es 5.x的内部使用的 apache log4日志
  compile "org.apache.logging.log4j:log4j-core:2.7"
  compile "org.apache.logging.log4j:log4j-api:2.7"

这里spring boot使用的是1.5.4版,前些天spring boot 2正式版已经发布,spring boot 2新特性中有一条是支持kotlin,spring boot 2基于spring 5,spring 5也支持了koltin,所以spring也开始支持函数式编程。

关于版本兼容

配置访问Elasticsearch的客户端,这里都使用原生es JavaAPI。

@Configuration
public class ElasticSearchConfig {
  @Bean(name = "client")
  public TransportClient getClient() {
    InetSocketTransportAddress node = null;
    try {
      node = new InetSocketTransportAddress(InetAddress.getByName("192.168.124.128"), 9300);
    } catch (UnknownHostException e) {
      e.printStackTrace();
    }
    Settings settings = Settings.builder().put("cluster.name", "my-es").build();
    TransportClient client = new PreBuiltTransportClient(settings);
    client.addTransportAddress(node);
    return client;
  }
}

SocketTransport端口可以使用http://ip:9200/_nodes方式查看,这里默认使用的是9300端口。

CRUD操作

新建一个控制器ElasticSearchController,使用原生的es JavaAPI。

@RestController
public class ElasticSearchController {
  @Autowired
  TransportClient client;
}

在控制器中添加增删查改方法

增加操作

@PostMapping("add/book/novel")
  public ResponseEntity add(
      @RequestParam(name = "title") String title, @RequestParam(name = "authro") String author,
      @RequestParam(name = "word_count") int wordCount,
      @RequestParam(name = "publish_date") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")Date publishDate
      )
  {
    try {
      XContentBuilder content = XContentFactory.jsonBuilder().startObject()
          .field("title", title)
          .field("author", author)
          .field("word_count", wordCount)
          .field("publish_date", publishDate.getTime())
          .endObject();
      IndexResponse result = this.client.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);
    }
  }

删除操作

@DeleteMapping("/delete/book/novel")
  public ResponseEntity delete(@RequestParam(name = "id") String id)
  {
    DeleteResponse result = client.prepareDelete("book", "novel", id).get();
    return new ResponseEntity(result.getResult().toString(), HttpStatus.OK);
  }

查找操作

@GetMapping("/get/book/novel")
  public ResponseEntity get(@RequestParam(name = "id", defaultValue="") String id)
  {
    if (id.isEmpty())
    {
      return new ResponseEntity(HttpStatus.NOT_FOUND);
    }
    GetResponse result = this.client.prepareGet("book", "novel", id).get();
    if (!result.isExists())
    {
      return new ResponseEntity(HttpStatus.NOT_FOUND);
    }
    return new ResponseEntity(result.getSource(), HttpStatus.OK);
  }

更新操作

@PutMapping("/put/book/novel")
  public ResponseEntity update(@RequestParam(name = "id") String id, @RequestParam(name = "title", required = false) String title,
    @RequestParam(name = "author", required = false) String author
  )
  {
    try {
      XContentBuilder builder = XContentFactory.jsonBuilder().startObject();
      if (title!= null)
      {
        builder.field("title", title);
      }
      if (author != null)
      {
        builder.field("author", author);
      }
      builder.endObject();
      UpdateRequest updateRequest = new UpdateRequest("book", "novel", id);
      updateRequest.doc(builder);
      UpdateResponse result = client.update(updateRequest).get();
      return new ResponseEntity(result.getResult().toString(), HttpStatus.OK);
    } catch (Exception e) {
      e.printStackTrace();
      return new ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR);
    }
  }

复合查找

@GetMapping("/query/book/novel")
  public ResponseEntity query(@RequestParam(name = "author", required = false) String author,
                   @RequestParam(name = "title", required = false) String title,
                   @RequestParam(name = "gt_word_count", defaultValue = "0") int 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 searchRequestBuilder = this.client.prepareSearch("book")
        .setTypes("novel")
        .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
        .setQuery(boolQueryBuilder)
        .setFrom(0)
        .setSize(10);
    System.out.println(searchRequestBuilder); //调试用
    SearchResponse response = searchRequestBuilder.get();
    List<Map<String, Object>> result = new ArrayList<>();
    for (SearchHit hit : response.getHits())
    {
      result.add(hit.getSource());
    }
    return new ResponseEntity(result, HttpStatus.OK);
  }

上面的代码组织的复合查询类似下面的Query DSL:

{
  "query":{
    "bool":{
      "must":[
        {"match":{"author":"张三"}},
        {"match":{"title":"Elasticsearch"}}
      ],
      "filter":[
        {"range":
          {"word_count":{
              "gt":"0",
              "lt":"3000"
            }
          }
        }
      ]
    }
  }
}

总结

以上所述是小编给大家介绍的SpringBoot整合Elasticsearch并实现CRUD操作,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

您可能感兴趣的文章:

  • IDEA+maven+SpringBoot+JPA+Thymeleaf实现Crud及分页
(0)

相关推荐

  • IDEA+maven+SpringBoot+JPA+Thymeleaf实现Crud及分页

    一.开发环境: 1.windows 7 企业版 2.IDEA 14 3.JDK 1.8 4.Maven 3.5.2 5.MariaDB 6.SQLYog 二.Maven设置: Maven目录下的conf目录下的settings.xml做如下内容的添加: 1.使用阿里云的仓库,比官网访问速度快很多 <mirror> <id>nexus-aliyun</id> <mirrorOf>central</mirrorOf> <name>Nexu

  • SpringBoot整合Elasticsearch并实现CRUD操作

     配置准备 在build.gradle文件中添加如下依赖: compile "org.elasticsearch.client:transport:5.5.2" compile "org.elasticsearch:elasticsearch:5.5.2" //es 5.x的内部使用的 apache log4日志 compile "org.apache.logging.log4j:log4j-core:2.7" compile "org

  • SpringBoot 整合 ElasticSearch操作各种高级查询搜索

    目录 一.简介 二.代码实践 三.小结 一.简介 在上篇​SpringBoot 整合 ElasticSearch​​​文章中,我们详细的介绍了 ElasticSearch 的索引和文档的基本增删改查的操作方法! 本文将重点介绍 ES 的各种高级查询写法和使用. 废话不多说,直接上代码! 二.代码实践 本文采用的SpringBoot版本号是2.1.0.RELEASE,服务端 es 的版本号是6.8.2,客户端采用的是官方推荐的Elastic Java High Level Rest Client版

  • SpringBoot整合Elasticsearch游标查询的示例代码(scroll)

    游标查询(scroll)简介 scroll 查询 可以用来对 Elasticsearch 有效地执行大批量的文档查询,而又不用付出深度分页那种代价. 游标查询会取某个时间点的快照数据. 查询初始化之后索引上的任何变化会被它忽略. 它通过保存旧的数据文件来实现这个特性,结果就像保留初始化时的索引 视图 一样. 启用游标查询可以通过在查询的时候设置参数 scroll 的值为我们期望的游标查询的过期时间. 游标查询的过期时间会在每次做查询的时候刷新,所以这个时间只需要足够处理当前批的结果就可以了,而不

  • SpringBoot整合Elasticsearch实现索引和文档的操作方法

    Elasticsearch 是一个分布式.可扩展.近实时的高性能搜索与数据分析引擎.Elasticsearch 基于 Apache Lucene 构建,采用 Java 编写,并使用 Lucene 构建索引.提供搜索功能.Elasticsearch 的目标是让全文搜索功能的落地变得简单. 本文是SpringBoot整合Elasticsearch与综合实例的第一篇,主要实现SpringBoot整合Elasticsearch实现索引和文档的相关操作. 1.SpringBoot整合Elasticsear

  • springboot整合mongodb并实现crud步骤详解

    整合 首先我们得使用springboot整合咱们的mongodb,第一步,当然是引入依赖啦 <!--mybatis--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</version> </depende

  • SpringBoot 整合 Elasticsearch 实现海量级数据搜索功能

    目录 一.简介 二.代码实践 2.1.导入依赖 2.2.配置环境变量 2.3.创建 elasticsearch 的 config 类 2.4.索引管理 2.5.文档管理 三.小结 今天给大家讲讲 SpringBoot 框架 整合 Elasticsearch 实现海量级数据搜索. 一.简介 在上篇ElasticSearch 文章中,我们详细的介绍了 ElasticSearch 的各种 api 使用. 实际的项目开发过程中,我们通常基于某些主流框架平台进行技术开发,比如 SpringBoot,今天我

  • 解决SpringBoot整合ElasticSearch遇到的连接问题

    SpringBoot整合ElasticSearch的连接问题 failed to load elasticsearch nodes : org.elasticsearch.client.transport.NoNodeAvailableException: None of the configured nodes are available: [{#transport#-1}{4J2eCGFXSZmM3xH72WIF5A}{192.168.252.200}{192.168.252.200:930

  • Spring Boot整合Mybatis并完成CRUD操作的实现示例

    MyBatis 是一款优秀的持久层框架,被各大互联网公司使用,本文使用Spring Boot整合Mybatis,并完成CRUD操作. 为什么要使用Mybatis?我们需要掌握Mybatis吗? 说的官方一点: MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordina

  • SpringBoot整合ElasticSearch实践

    本节我们基于一个发表文章的案例来说明SpringBoot如何elasticsearch集成.elasticsearch本身可以是一个独立的服务,也可以嵌入我们的web应用中,在本案例中,我们讲解如何将elasticsearch嵌入我们的应用中. 案例背景:每个文章(Article)都要属于一个教程(Tutorial),而且每个文章都要有一个作者(Author). 一.实体设计: Tutorial.java public class Tutorial implements Serializable

  • SpringBoot整合ElasticSearch的示例代码

    ElasticSearch作为基于Lucene的搜索服务器,既可以作为一个独立的服务部署,也可以签入Web应用中.SpringBoot作为Spring家族的全新框架,使得使用SpringBoot开发Spring应用变得非常简单.本文要介绍如何整合ElasticSearch与SpringBoot. 实体设计: 每一本书(Book)都属于一个分类(Classify),都有一个作者(Author). 生成这个三个实体类,并实现其get和set方法. SpringBoot配置修改: 1.修改pom.xm

随机推荐