最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot整合Elasticsearch并實現(xiàn)CRUD操作

 更新時間:2018年03月09日 15:36:35   作者:zxc123e  
這篇文章主要介紹了SpringBoot整合Elasticsearch并實現(xiàn)CRUD操作,需要的朋友可以參考下

 配置準(zhǔn)備

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

  compile "org.elasticsearch.client:transport:5.5.2"
  compile "org.elasticsearch:elasticsearch:5.5.2"
  //es 5.x的內(nèi)部使用的 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正式版已經(jīng)發(fā)布,spring boot 2新特性中有一條是支持kotlin,spring boot 2基于spring 5,spring 5也支持了koltin,所以spring也開始支持函數(shù)式編程。

關(guān)于版本兼容

這里寫圖片描述

配置訪問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);
    }
  }

復(fù)合查找

@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); //調(diào)試用
    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);
  }

上面的代碼組織的復(fù)合查詢類似下面的Query DSL:

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

總結(jié)

以上所述是小編給大家介紹的SpringBoot整合Elasticsearch并實現(xiàn)CRUD操作,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Spring?Boot存在路徑遍歷漏洞CVE-2021-22118的問題解析

    Spring?Boot存在路徑遍歷漏洞CVE-2021-22118的問題解析

    CVE-2021-22118?是一個在?Spring?Boot?中發(fā)現(xiàn)的漏洞,該漏洞關(guān)系到?Spring?Boot?的開發(fā)者工具(Devtools)中的遠程更新(Remote?Update)功能,這篇文章主要介紹了Spring?Boot存在路徑遍歷漏洞CVE-2021-22118,需要的朋友可以參考下
    2023-09-09
  • java之抽象類和繼承抽象類解讀

    java之抽象類和繼承抽象類解讀

    這篇文章主要介紹了java之抽象類和繼承抽象類,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • JDBC PreparedStatement Like參數(shù)報錯解決方案

    JDBC PreparedStatement Like參數(shù)報錯解決方案

    這篇文章主要介紹了JDBC PreparedStatement Like參數(shù)報錯解決方案,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-10-10
  • Java面向?qū)ο蠡A(chǔ)知識之?dāng)?shù)組和鏈表

    Java面向?qū)ο蠡A(chǔ)知識之?dāng)?shù)組和鏈表

    這篇文章主要介紹了Java面向?qū)ο蟮闹當(dāng)?shù)組和鏈表,文中有非常詳細的代碼示例,對正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-11-11
  • 如何解決SpringBoot2.x版本對Velocity模板不支持的方案

    如何解決SpringBoot2.x版本對Velocity模板不支持的方案

    這篇文章主要介紹了如何解決SpringBoot2.x版本對Velocity模板不支持的方案,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • Java設(shè)計模式之命令模式CommandPattern詳解

    Java設(shè)計模式之命令模式CommandPattern詳解

    這篇文章主要介紹了Java設(shè)計模式之命令模式CommandPattern詳解,命令模式是把一個請求封裝為一個對象,從而使你可用不同的請求對客戶進行參數(shù)化;對請求排隊或記錄請求日志,以及支持可撤銷的操作,需要的朋友可以參考下
    2023-10-10
  • httpclient的CPool定義方法詳解

    httpclient的CPool定義方法詳解

    這篇文章主要為大家介紹了httpclient的CPool定義方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • JAVA Netty實現(xiàn)聊天室+私聊功能的示例代碼

    JAVA Netty實現(xiàn)聊天室+私聊功能的示例代碼

    這篇文章主要介紹了JAVA Netty實現(xiàn)聊天室+私聊功能的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • SpringMVC中利用@InitBinder來對頁面數(shù)據(jù)進行解析綁定的方法

    SpringMVC中利用@InitBinder來對頁面數(shù)據(jù)進行解析綁定的方法

    本篇文章主要介紹了SpringMVC中利用@InitBinder來對頁面數(shù)據(jù)進行解析綁定的方法,非常具有實用價值,需要的朋友可以參考下
    2018-03-03
  • 一場由Java中Integer引發(fā)的踩坑實戰(zhàn)

    一場由Java中Integer引發(fā)的踩坑實戰(zhàn)

    Java中的數(shù)據(jù)類型分為基本數(shù)據(jù)類型和復(fù)雜數(shù)據(jù)類型int是前者而integer是后者(也就是一個類),下面這篇文章主要給大家介紹了關(guān)于由Java中Integer引發(fā)的踩坑實戰(zhàn),需要的朋友可以參考下
    2022-11-11

最新評論

繁峙县| 泽普县| 巴中市| 雅江县| 山阴县| 崇左市| 徐州市| 陆丰市| 依兰县| 崇信县| 安岳县| 门头沟区| 达孜县| 大余县| 新郑市| 顺平县| 商南县| 获嘉县| 蕉岭县| 张家港市| 彰化市| 巨野县| 个旧市| 嵊州市| 府谷县| 赤水市| 新乐市| 青神县| 柞水县| 榕江县| 夏邑县| 蕉岭县| 都昌县| 收藏| 耿马| 靖江市| 寻甸| 海南省| 嘉峪关市| 石城县| 建阳市|