日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

SpringBoot 如何整合 ES 實現(xiàn) CRUD 操作

瀏覽:111日期:2023-04-14 15:06:59

本文介紹 Spring Boot 項目中整合 ElasticSearch 并實現(xiàn) CRUD 操作,包括分頁、滾動等功能。之前在公司使用 ES,一直用的是前輩封裝好的包,最近希望能夠從原生的 Spring Boot/ES 語法角度來學(xué)習(xí) ES 的相關(guān)技術(shù)。希望對大家有所幫助。

本文為 spring-boot-examples 系列文章節(jié)選,示例代碼已上傳至 https://github.com/laolunsi/spring-boot-examples

安裝 ES 與可視化工具

前往 ES 官方 https://www.elastic.co/cn/downloads/elasticsearch 進行,如 windows 版本只需要下載安裝包,啟動 elasticsearch.bat 文件,瀏覽器訪問 http://localhost:9200

SpringBoot 如何整合 ES 實現(xiàn) CRUD 操作

如此,表示 ES 安裝完畢。

為更好地查看 ES 數(shù)據(jù),再安裝一下 elasticsearch-head 可視化插件。前往下載地址:https://github.com/mobz/elasticsearch-head主要步驟:

git clone git://github.com/mobz/elasticsearch-head.git cd elasticsearch-head npm install npm run start open http://localhost:9100/

可能會出現(xiàn)如下情況:

SpringBoot 如何整合 ES 實現(xiàn) CRUD 操作

發(fā)現(xiàn)是跨域的問題。解決辦法是在 elasticsearch 的 config 文件夾中的 elasticsearch.yml 中添加如下兩行配置:

http.cors.enabled: truehttp.cors.allow-origin: '*'

刷新頁面:

SpringBoot 如何整合 ES 實現(xiàn) CRUD 操作

這里的 article 索引就是我通過 spring boot 項目自動創(chuàng)建的索引。下面我們進入正題。

Spring Boot 引入 ES

創(chuàng)建一個 spring-boot 項目,引入 es 的依賴:

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency>

配置 application.yml:

server: port: 8060spring: elasticsearch: rest: uris: http://localhost:9200

創(chuàng)建一個測試的對象,article:

import org.springframework.data.annotation.Id;import org.springframework.data.elasticsearch.annotations.Document;import java.util.Date;@Document(indexName = 'article')public class Article { @Id private String id; private String title; private String content; private Integer userId; private Date createTime; // ... igonre getters and setters}

下面介紹 Spring Boot 中操作 ES 數(shù)據(jù)的三種方式:

實現(xiàn) ElasticsearchRepository 接口 引入 ElasticsearchRestTemplate 引入 ElasticsearchOperations

實現(xiàn)對應(yīng)的 Repository:

import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;public interface ArticleRepository extends ElasticsearchRepository<Article, String> {}

下面可以使用這個 ArticleRepository 來操作 ES 中的 Article 數(shù)據(jù)。我們這里沒有手動創(chuàng)建這個 Article 對應(yīng)的索引,由 elasticsearch 默認生成。

下面的接口,實現(xiàn)了 spring boot 中對 es 數(shù)據(jù)進行插入、更新、分頁查詢、滾動查詢、刪除等操作。可以作為一個參考。其中,使用了 Repository 來獲取、保存、刪除 ES 數(shù)據(jù),使用 ElasticsearchRestTemplate 或 ElasticsearchOperations 來進行分頁/滾動查詢。

根據(jù) id 獲取/刪除數(shù)據(jù)

@Autowired private ArticleRepository articleRepository; @GetMapping('{id}') public JsonResult findById(@PathVariable String id) { Optional<Article> article = articleRepository.findById(id); JsonResult jsonResult = new JsonResult(true); jsonResult.put('article', article.orElse(null)); return jsonResult; } @DeleteMapping('{id}') public JsonResult delete(@PathVariable String id) { // 根據(jù) id 刪除 articleRepository.deleteById(id); return new JsonResult(true, '刪除成功'); }

保存數(shù)據(jù)

@PostMapping('') public JsonResult save(Article article) { // 新增或更新 String verifyRes = verifySaveForm(article); if (!StringUtils.isEmpty(verifyRes)) { return new JsonResult(false, verifyRes); } if (StringUtils.isEmpty(article.getId())) { article.setCreateTime(new Date()); } Article a = articleRepository.save(article); boolean res = a.getId() != null; return new JsonResult(res, res ? '保存成功' : ''); } private String verifySaveForm(Article article) { if (article == null || StringUtils.isEmpty(article.getTitle())) { return '標(biāo)題不能為空'; } else if (StringUtils.isEmpty(article.getContent())) { return '內(nèi)容不能為空'; } return null; }

分頁查詢數(shù)據(jù)

@Autowired private ElasticsearchRestTemplate elasticsearchRestTemplate; @Autowired ElasticsearchOperations elasticsearchOperations; @GetMapping('list') public JsonResult list(Integer currentPage, Integer limit) { if (currentPage == null || currentPage < 0 || limit == null || limit <= 0) { return new JsonResult(false, '請輸入合法的分頁參數(shù)'); } // 分頁列表查詢 // 舊版本的 Repository 中的 search 方法被廢棄了。 // 這里采用 ElasticSearchRestTemplate 或 ElasticsearchOperations 來進行分頁查詢 JsonResult jsonResult = new JsonResult(true); NativeSearchQuery query = new NativeSearchQuery(new BoolQueryBuilder()); query.setPageable(PageRequest.of(currentPage, limit)); // 方法1: SearchHits<Article> searchHits = elasticsearchRestTemplate.search(query, Article.class); // 方法2: // SearchHits<Article> searchHits = elasticsearchOperations.search(query, Article.class); List<Article> articles = searchHits.getSearchHits().stream().map(SearchHit::getContent).collect(Collectors.toList()); jsonResult.put('count', searchHits.getTotalHits()); jsonResult.put('articles', articles); return jsonResult; }

滾動查詢數(shù)據(jù)

@GetMapping('scroll') public JsonResult scroll(String scrollId, Integer size) { // 滾動查詢 scroll api if (size == null || size <= 0) { return new JsonResult(false, '請輸入每頁查詢數(shù)'); } NativeSearchQuery query = new NativeSearchQuery(new BoolQueryBuilder()); query.setPageable(PageRequest.of(0, size)); SearchHits<Article> searchHits = null; if (StringUtils.isEmpty(scrollId)) { // 開啟一個滾動查詢,設(shè)置該 scroll 上下文存在 60s // 同一個 scroll 上下文,只需要設(shè)置一次 query(查詢條件) searchHits = elasticsearchRestTemplate.searchScrollStart(60000, query, Article.class, IndexCoordinates.of('article')); if (searchHits instanceof SearchHitsImpl) { scrollId = ((SearchHitsImpl) searchHits).getScrollId(); } } else { // 繼續(xù)滾動 searchHits = elasticsearchRestTemplate.searchScrollContinue(scrollId, 60000, Article.class, IndexCoordinates.of('article')); } List<Article> articles = searchHits.getSearchHits().stream().map(SearchHit::getContent).collect(Collectors.toList()); if (articles.size() == 0) { // 結(jié)束滾動 elasticsearchRestTemplate.searchScrollClear(Collections.singletonList(scrollId)); scrollId = null; } if (scrollId == null) { return new JsonResult(false, '已到末尾'); } else { JsonResult jsonResult = new JsonResult(true); jsonResult.put('count', searchHits.getTotalHits()); jsonResult.put('size', articles.size()); jsonResult.put('articles', articles); jsonResult.put('scrollId', scrollId); return jsonResult; } }

ES 深度分頁 vs 滾動查詢

上次遇到一個問題,同事跟我說日志檢索的接口太慢了,問我能不能優(yōu)化一下。開始使用的是深度分頁,即 1,2,3..10, 這樣的分頁查詢,查詢條件較多(十多個參數(shù))、查詢數(shù)據(jù)量較大(單個日志索引約 2 億條數(shù)據(jù))。

分頁查詢速度慢的原因在于:ES 的分頁查詢,如查詢第 100 頁數(shù)據(jù),每頁 10 條,是先從每個分區(qū) (shard,一個索引默認是 5 個 shard) 中把命中的前 100 * 10 條數(shù)據(jù)查出來,然后由協(xié)調(diào)節(jié)點進行合并等操作,最后給出第 100 頁的數(shù)據(jù)。也就是說,實際被加載到內(nèi)存中的數(shù)據(jù)遠超過理想情況。

這樣,索引的 shard 越大,查詢頁數(shù)越多,查詢速度就越慢。ES 默認的 max_result_window 是 10000 條,也就是正常情況下,用分頁查詢到 10000 條數(shù)據(jù)時,就不會再返回下一頁數(shù)據(jù)了。

如果不需要進行跳頁,比如直接查詢第 100 頁數(shù)據(jù),或者數(shù)據(jù)量非常大,那么可以考慮用 scroll 查詢。在 scroll 查詢下,第一次需要根據(jù)查詢參數(shù)開啟一個 scroll 上下文,設(shè)置上下文緩存時間。以后的滾動只需要根據(jù)第一次返回的 scrollId 來進行即可。

scroll 只支持往下滾動,如果想要往回滾動,還可以根據(jù) scrollId 緩存查詢結(jié)果,這樣就可以實現(xiàn)上下滾動查詢了 —— 就像大家經(jīng)常使用的淘寶商品檢索時上下滾動一樣。

以上就是SpringBoot 如何整合 ES 實現(xiàn) CRUD 操作的詳細內(nèi)容,更多關(guān)于SpringBoot實現(xiàn) CRUD 操作的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲二区精品| 亚洲精品乱码| 青草综合视频| 婷婷五月色综合香五月| 日韩久久99| 欧美久久亚洲| 不卡视频在线| 亚洲一级网站| 亚洲一区二区三区高清不卡| 婷婷色综合网| 亚洲精品日韩久久| 伊人久久一区| 欧美一区久久| 麻豆精品在线| 成人看片网站| 精品国产18久久久久久二百| 麻豆精品久久久| 国产一区二区三区不卡av | 97精品国产99久久久久久免费| 91大神在线观看线路一区| 国产日韩1区| 久久99高清| 999精品在线| 日本中文字幕一区二区| 免费一级欧美片在线观看网站 | 红桃视频亚洲| 日韩精品欧美精品| 精品网站999| 另类欧美日韩国产在线| 亚洲精品一级二级三级| 久久69成人| 久久电影一区| 国产成人久久精品麻豆二区| 性欧美长视频| 日韩综合精品| 国产乱子精品一区二区在线观看 | 国产精品成人**免费视频| 久久久久久婷| 国产精品最新| 免费不卡在线观看| 999久久久91| 国产精品白丝久久av网站| 自由日本语亚洲人高潮| av在线资源| 国产精品日韩精品在线播放| 美女精品一区| 激情综合自拍| 91精品一区二区三区综合在线爱 | 最新国产拍偷乱拍精品| 久久99精品久久久野外观看| 亚洲一区欧美激情| 国产综合视频| 久久国产电影| 日韩精品一卡| 久久麻豆视频| 你懂的国产精品永久在线| 日韩 欧美一区二区三区| 一区二区精品| 日韩和欧美一区二区| 美国三级日本三级久久99| 激情欧美亚洲| 免费国产自线拍一欧美视频| 国产一区久久| 在线亚洲国产精品网站| 国产精品人人爽人人做我的可爱| 亚洲www啪成人一区二区| 另类专区亚洲| 精精国产xxxx视频在线野外| av资源中文在线| 国产精品99久久免费| 国产精品白丝一区二区三区| 麻豆91精品视频| 秋霞影视一区二区三区| 蜜桃tv一区二区三区| 国产视频一区免费看| 免费观看久久久4p| 国产精品亚洲产品| 日韩三区免费| 国产精品日韩欧美一区| 五月国产精品| 国内精品伊人| 99国产精品| 97se亚洲| 久久亚洲国产| 亚洲无线观看| 日本高清不卡一区二区三区视频 | 欧美日本三区| 欧美一级鲁丝片| 一区二区国产在线观看| 国产 日韩 欧美 综合 一区| 性欧美69xoxoxoxo| 国产精品久久久久久久久久妞妞 | 日韩不卡一区二区三区| 老牛国内精品亚洲成av人片| 久久久蜜桃一区二区人| 日韩高清中文字幕一区| 日韩免费福利视频| 欧美视频一区| 丝瓜av网站精品一区二区 | 91免费精品国偷自产在线在线| 精品久久97| 日韩精品导航| 999久久久精品国产| 日韩av网站在线免费观看| 精品视频国产| 三级欧美在线一区| 国产精品久久久久久久免费观看| 石原莉奈在线亚洲二区| 日韩成人三级| 麻豆一区在线| 欧美亚洲三级| 久久精品 人人爱| 午夜久久久久| 精品国产亚洲一区二区三区大结局 | 欧美女激情福利| 国产成人久久精品麻豆二区| 欧美精品中文| 99视频精品免费观看| 日韩精品免费一区二区三区| 国产精品一卡| 国产欧美日韩精品高清二区综合区 | 日本综合视频| 日韩精品免费视频一区二区三区| 亚洲经典在线| 日韩中文字幕麻豆| 久久福利毛片| 免播放器亚洲| 亚洲人成毛片在线播放女女| 欧美/亚洲一区| 一区免费视频| 亚洲一区日本| 蜜臀久久99精品久久久久久9| 男女精品网站| 亚欧洲精品视频在线观看| 日本不卡不码高清免费观看| 欧美日韩亚洲一区二区三区在线| 欧美片第1页综合| 精品亚洲精品| 日韩精品免费一区二区三区| 美女久久久久| 亚洲资源网站| 国产精品最新| 99精品小视频| 黄色日韩精品| 国产欧美日韩亚洲一区二区三区| 激情综合五月| 亚洲欧美日韩国产一区二区| 亚洲免费观看高清完整版在线观| 国产精品一区二区三区四区在线观看| 久久精品国产99国产| 亚洲精品网址| 国产福利资源一区| 99精品视频在线| 国产欧美三级| 国产国产精品| 麻豆视频一区二区| 丝袜诱惑制服诱惑色一区在线观看| 日韩免费精品| 色乱码一区二区三区网站| 亚洲精品中文字幕乱码| 国产欧美69| 麻豆亚洲精品| 久久久久国产精品一区二区| 日本aⅴ免费视频一区二区三区| 蜜桃精品在线| 国产激情欧美| 日韩欧美久久| 91精品电影| 久久久久久自在自线| 日韩高清三区| 亚洲在线国产日韩欧美| 精品欠久久久中文字幕加勒比| 麻豆成人在线| 日韩欧美精品综合| 91精品一区| 日韩一区欧美二区| 色爱av综合网| 精品高清久久| 欧美日韩亚洲三区| 亚洲欧美日韩一区在线观看| 日韩久久精品| 久久亚州av| 国产精品久久国产愉拍| 中文字幕视频精品一区二区三区| 欧美日韩第一| 美女亚洲一区| 91国语精品自产拍| 激情偷拍久久| 亚洲伦乱视频| 中文字幕在线官网| 99久久www免费| yellow在线观看网址| 国产suv精品一区二区四区视频| 久久国产精品免费精品3p| 国产高潮在线| 日韩美女一区二区三区在线观看| 国产一区二区三区网| 激情综合五月| 黄色aa久久| 亚洲成av在线|