一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - SpringBoot整合Elasticsearch并實現CRUD操作

SpringBoot整合Elasticsearch并實現CRUD操作

2021-04-10 13:35zxc123e Java教程

這篇文章主要介紹了SpringBoot整合Elasticsearch并實現CRUD操作,需要的朋友可以參考下

 配置準備

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

?
1
2
3
4
5
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。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@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。

?
1
2
3
4
5
@RestController
public class ElasticSearchController {
  @Autowired
  TransportClient client;
}

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

增加操作

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@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);
    }
  }

刪除操作

?
1
2
3
4
5
6
@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);
  }

查找操作

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@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);
  }

更新操作

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@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);
    }
  }

復合查找

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
@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:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
  "query":{
    "bool":{
      "must":[
        {"match":{"author":"張三"}},
        {"match":{"title":"Elasticsearch"}}
      ],
      "filter":[
        {"range":
          {"word_count":{
              "gt":"0",
              "lt":"3000"
            }
          }
        }
      ]
    }
  }
}

總結

以上所述是小編給大家介紹的SpringBoot整合Elasticsearch并實現CRUD操作,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!

原文鏈接:http://blog.csdn.net/zxc123e/article/details/79498113

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 96日本xxxxxxxxx70 95在线观看精品视频 | 国产高清在线看 | 扒开黑女人p大荫蒂老女人 扒开大腿狠狠挺进视频 | 范冰冰上面好大下面好紧 | 欧美成人二区 | 国产japanese孕妇孕交 | 精品国产乱码久久久久久免费 | 乌克兰18sex性hd | 无码爽死成人777在线观看网站 | 亚洲福利视频一区 | 亚洲国产成人99精品激情在线 | 玩50岁四川熟女大白屁股直播 | 好大好硬好紧太深了受不了 | 亚洲阿v天堂在线2017 | 亚洲高清视频在线 | 大伊香蕉精品二区视频在线 | 国产情侣视频观看 | 龟甲情感超市全文阅读 小说 | 国产成人在线影院 | 日韩亚洲人成网站在线播放 | 亚洲卡一卡2卡三卡4卡无卡三 | 免费在线观看中文字幕 | 北岛玲在线视频 | 亚洲 日韩经典 中文字幕 | 亚洲国产在线观看免费视频 | 万域之王动漫在线观看全集免费播放 | 五月色婷婷网在线观看 | 亚洲国产精品婷婷久久久久 | 日韩视频免费观看 | 青视频在线 | 美女脱了内裤打开腿让你桶爽 | 超h 超重口 高h 污肉1v1 | 2022色婷婷综合久久久 | 日韩免费毛片视频杨思敏 | 国产真实偷乱视频在线观看 | 欧美春宫 | 香蕉人人超人人超碰超国产 | 国产成人啪精品午夜在线播放 | 精品湿 | 俄罗斯一级毛片免费播放 | 美女扒开尿口让男生添 漫画 |