中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringBoot整合Elasticsearch并實現CRUD操作的示例分析

發布時間:2021-07-08 10:50:43 來源:億速云 閱讀:175 作者:小新 欄目:編程語言

這篇文章主要為大家展示了“SpringBoot整合Elasticsearch并實現CRUD操作的示例分析”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“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也開始支持函數式編程。

關于版本兼容

SpringBoot整合Elasticsearch并實現CRUD操作的示例分析

配置訪問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操作的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

霍邱县| 万山特区| 琼结县| 兴业县| 阳泉市| 瓦房店市| 珠海市| 廉江市| 乐山市| 江门市| 突泉县| 本溪| 晋宁县| 芜湖县| 藁城市| 万全县| 金阳县| 浦城县| 酒泉市| 临海市| 纳雍县| 太谷县| 汉川市| 盐山县| 伊金霍洛旗| 宜良县| 上思县| 巩留县| 区。| 哈密市| 阿拉善左旗| 齐河县| 襄城县| 鹤壁市| 庆安县| 安徽省| 进贤县| 大竹县| 阜新市| 阜新| 南充市|