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

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

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

服務器之家 - 編程語言 - Java教程 - 使用Spring Boot + Elasticsearch + Logstash 實現圖書查詢檢索服務

使用Spring Boot + Elasticsearch + Logstash 實現圖書查詢檢索服務

2022-01-05 22:44架構師精進章為忠 Java教程

logstash是一個開源的服務器端數據處理工具。簡單來說,就是一根具備實時數據傳輸能力的管道,負責將數據信息從管道的輸入端傳輸到管道的輸出端;與此同時這根管道還可以讓你根據自己的需求在中間加上濾網,Logstash提供了很

使用Spring Boot + Elasticsearch + Logstash 實現圖書查詢檢索服務

前面我們介紹了Spring Boot 整合 Elasticsearch 實現數據查詢檢索的功能,在實際項目中,我們的數據一般存儲在數據庫中,而且隨著業務的發送,數據也會隨時變化。

那么如何保證數據庫中的數據與Elasticsearch存儲的索引數據保持一致呢? 最原始的方案就是:當數據發生增刪改操作時同步更新Elasticsearch。但是這樣的設計耦合太高。接下來我們介紹一種非常簡單的數據同步方式:Logstash 數據同步。

一、Logstash簡介

1.什么是Logstash

logstash是一個開源的服務器端數據處理工具。簡單來說,就是一根具備實時數據傳輸能力的管道,負責將數據信息從管道的輸入端傳輸到管道的輸出端;與此同時這根管道還可以讓你根據自己的需求在中間加上濾網,Logstash提供里很多功能強大的濾網以滿足你的各種應用場景。

Logstash常用于日志系統中做日志采集設備,最常用于ELK中作為日志收集器使用。

2.Logstash的架構原理

Logstash的基本流程架構:input=》 filter =》 output 。

input(輸入):采集各種樣式,大小和來源數據,從各個服務器中收集數據。常用的有:jdbc、file、syslog、redis等。

filter(過濾器)負責數據處理與轉換。主要是將event通過output發出之前對其實現的某些處理功能。

output(輸出):將我們過濾出的數據保存到那些數據庫和相關存儲中,。

使用Spring Boot + Elasticsearch + Logstash 實現圖書查詢檢索服務

3.Logstash如何與Elasticsearch數據同步

實際項目中,我們不可能通過手動添加的方式將數據插入索引庫,所以需要借助第三方工具,將數據庫的數據同步到索引庫。此時,Logstash出現了,它可以將不同數據庫的數據同步到Elasticsearch中。保證數據庫與Elasticsearch的數據保持一致。

使用Spring Boot + Elasticsearch + Logstash 實現圖書查詢檢索服務

目前支持數據庫與ES數據同步的插件有很多,個人認為Logstash是眾多同步mysql數據到es的插件中,最穩定并且最容易配置的一個。

二、安裝Logstash

Logstash的使用方法也很簡單,下面講解一下,Logstash是如何使用的。需要說明的是:這里以windows 環境為例,演示Logstash的安裝和配置。

1.下載Logstash

首先,下載對應版本的Logstash包,可以通過上面提供下載elasticsearch的地址進行下載,完成后解壓。

使用Spring Boot + Elasticsearch + Logstash 實現圖書查詢檢索服務

上面是Logstash解壓后的目錄,我們需要關注是bin目錄中的執行文件和config中的配置文件。一般生產情況下,會使用Linux服務器,并且會將Logstash配置成自啟動的服務。這里測試的話,直接啟動。

2.配置Logstash

接下來,配置Logstash。需要我們編寫配置文件,根據官網和網上提供的配置文件,將其進行修改。

第一步:在Logstash根目錄下創建mysql文件夾,添加mysql.conf配置文件,配置Logstash需要的相應信息,具體配置如下:

  1. input {
  2. stdin {
  3. }
  4. jdbc {
  5. # mysql數據庫連接
  6. jdbc_connection_string => "jdbc:mysql://localhost:3306/book_test?characterEncoding=utf-8&useSSL=false&serverTimezone=UTC"
  7. # mysqly用戶名和密碼
  8. jdbc_user => "root"
  9. jdbc_password => "root"
  10. # 驅動配置
  11. jdbc_driver_library => "C:\Users\Administrator\Desktop\logstash-7.5.1\mysql\mysql-connector-java-8.0.20.jar"
  12. # 驅動類名
  13. jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
  14. #jdbc_paging_enabled => "true"
  15. #jdbc_page_size => "50000"
  16. jdbc_default_timezone => "Asia/Shanghai"
  17. # 執行指定的sql文件
  18. statement_filepath => "C:\Users\Administrator\Desktop\logstash-7.5.1\mysql\sql\bookquery.sql"
  19. use_column_value => true
  20. # 是否將字段名轉換為小寫,默認true(如果有數據序列化、反序列化需求,建議改為false);
  21. lowercase_column_names => false
  22. # 需要記錄的字段,用于增量同步,需是數據庫字段
  23. tracking_column => updatetime
  24. # Value can be any of: numeric,timestampDefault value is "numeric"
  25. tracking_column_type => timestamp
  26. # record_last_run上次數據存放位置;
  27. record_last_run => true
  28. #上一個sql_last_value值的存放文件路徑, 必須要在文件中指定字段的初始值
  29. last_run_metadata_path => "C:\Users\Administrator\Desktop\logstash-7.5.1\mysql\sql\logstash_default_last_time.log"
  30. # 是否清除last_run_metadata_path的記錄,需要增量同步時此字段必須為false
  31. clean_run => false
  32. # 設置監聽 各字段含義 分 時 天 月 年 ,默認全部為*代表含義:每分鐘都更新
  33. schedule => "* * * * *"
  34. # 索引類型
  35. type => "id"
  36. }
  37. }
  38. output {
  39. elasticsearch {
  40. #es服務器
  41. hosts => ["10.2.1.231:9200"]
  42. #ES索引名稱
  43. index => "book"
  44. #自增ID
  45. document_id => "%{id}"
  46. }
  47. stdout {
  48. codec => json_lines
  49. }
  50. }

第二步:將mysql-connector-java.jar 拷貝到前面配置的目錄下。上面的mysql.conf配置的是:C:\Users\Administrator\Desktop\logstash-7.5.1\mysql\

mysql-connector-java-8.0.20.jar。那么jar包拷貝到此目錄下即可:

使用Spring Boot + Elasticsearch + Logstash 實現圖書查詢檢索服務

上面是mysql的驅動,如果是sqlserver數據庫,下載SqlServer對應的驅動即可。放置的位置要與mysql.conf 配置文件中的jdbc_driver_library 地址保持一致。

第三步:創建sql目錄,創建bookquery.sql文件用于保存需要執行的sql 腳本。示例代碼如下:

  1. select * from book where updatetime >= :sql_last_value
  2. order by updatetime desc

這里使用的增量更新,所以使用:sql_last_value 記錄上一次記錄的最后時間。

3.啟動Logstash

進入logstash的bin目錄,執行如下命令:

  1. logstash.bat -f C:\Users\Administrator\Desktop\logstash-7.5.1\mysql\mysql.conf

啟動成功之后,Logstash就會自動定時將數據寫入到Elasticsearch。如下圖所示:

使用Spring Boot + Elasticsearch + Logstash 實現圖書查詢檢索服務

同步完成后,我們使用Postman查詢Elasticsearch,驗證索引是否都創建成功。在postman中,發送 Get 請求:

http://10.2.1.231:9200/book/_search 。返回結果如下圖所示:

使用Spring Boot + Elasticsearch + Logstash 實現圖書查詢檢索服務

可以看到,數據庫中的數據已經通過Logstash同步至Elasticsearch。說明Logstash配置成功。

三、創建查詢服務

數據同步完成后,接下來我們使用Spring Boot 構建Elasticsearch查詢服務。首先創建Spring Boot項目并整合Elasticsearch,這個之前都已經介紹過,不清楚的朋友可以看我之前的文章。

接下來演示如何封裝完整的數據查詢服務。

1.數據實體

  1. @Document( indexName = "book" , replicas = 0)
  2. public class Book {
  3. @Id
  4. private Long id;
  5. @Field(analyzer = "ik_max_word",type = FieldType.Text)
  6. private String bookName;
  7. @Field(analyzer = "ik_max_word",type = FieldType.Text)
  8. private String author;
  9. private float price;
  10. private int page;
  11. @Field(type = FieldType.Date,format = DateFormat.custom,pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
  12. private Date createTime;
  13. @Field(type = FieldType.Date,format = DateFormat.custom,pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
  14. private Date updateTime;
  15. @Field(analyzer = "ik_max_word",type = FieldType.Text)
  16. private String category;
  17. public Long getId() {
  18. return id;
  19. }
  20. public void setId(Long id) {
  21. this.id = id;
  22. }
  23. public String getBookName() {
  24. return bookName;
  25. }
  26. public void setBookName(String bookName) {
  27. this.bookName = bookName;
  28. }
  29. public String getAuthor() {
  30. return author;
  31. }
  32. public void setAuthor(String author) {
  33. this.author = author;
  34. }
  35. public float getPrice() {
  36. return price;
  37. }
  38. public void setPrice(float price) {
  39. this.price = price;
  40. }
  41. public int getPage() {
  42. return page;
  43. }
  44. public void setPage(int page) {
  45. this.page = page;
  46. }
  47. public String getCategory() {
  48. return category;
  49. }
  50. public void setCategory(String category) {
  51. this.category = category;
  52. }
  53. public Book(){
  54. }
  55. public Date getCreateTime() {
  56. return createTime;
  57. }
  58. public void setCreateTime(Date createTime) {
  59. this.createTime = createTime;
  60. }
  61. public Date getUpdateTime() {
  62. return updateTime;
  63. }
  64. public void setUpdateTime(Date updateTime) {
  65. this.updateTime = updateTime;
  66. }
  67. }

2.請求封裝類

  1. public class BookQuery {
  2. public String category;
  3. public String bookName;
  4. public String author;
  5. public int priceMin;
  6. public int priceMax;
  7. public int pageMin;
  8. public int pageMax;
  9. public String sort;
  10. public String sortType;
  11. public int page;
  12. public int limit;
  13. }

3.創建Controller控制器

  1. @RestController
  2. public class ElasticSearchController {
  3. @Autowired
  4. private ElasticsearchRestTemplate elasticsearchRestTemplate;
  5. /**
  6. * 查詢信息
  7. * @param
  8. * @return
  9. */
  10. @PostMapping(value = "/book/query")
  11. public JSONResult query(@RequestBody BookQuery bookQuery){
  12. Query query= getQueryBuilder(bookQuery);
  13. SearchHits searchHits = elasticsearchRestTemplate.search(query, Book.class);
  14. List> result = searchHits.getSearchHits();
  15. return JSONResult.ok(result);
  16. }
  17. public Query getQueryBuilder(BookQuery query) {
  18. BoolQueryBuilder builder = boolQuery();
  19. // 匹配器 模糊查詢部分,分析器使用ik (ik_max_word)
  20. List must = builder.must();
  21. if (query.getBookName()!=null && !query.getBookName().isEmpty())
  22. must.add(wildcardQuery("bookName", "*" +query.getBookName()+ "*"));
  23. if (query.getCategory()!=null && !query.getCategory().isEmpty())
  24. must.add(wildcardQuery("category", "*" +query.getCategory()+ "*"));
  25. if (query.getAuthor()!=null && !query.getAuthor().isEmpty())
  26. must.add(wildcardQuery("author", "*" +query.getAuthor()+ "*"));
  27. // 篩選器 精確查詢部分
  28. List filter = builder.filter();
  29. // 范圍查詢
  30. if (query.getPriceMin()>0 && query.getPriceMax()>0) {
  31. RangeQueryBuilder price = rangeQuery("price").gte(query.getPriceMin()).lte(query.getPriceMax());
  32. filter.add(price);
  33. }
  34. // 范圍查詢
  35. if (query.getPageMin()>0 && query.getPageMax()>0) {
  36. RangeQueryBuilder page = rangeQuery("page").gte(query.getPageMin()).lte(query.getPageMax());
  37. filter.add(page);
  38. }
  39. // 分頁
  40. PageRequest pageable = PageRequest.of(query.getPage() - 1, query.getLimit());
  41. // 排序
  42. SortBuilder sort = SortBuilders.fieldSort("price").order(SortOrder.DESC);
  43. //設置高亮效果
  44. String preTag = "";//google的色值
  45. String postTag = "";
  46. HighlightBuilder.Field highlightFields = new HighlightBuilder.Field("category").preTags(preTag).postTags(postTag);
  47. Query searchQuery = new NativeSearchQueryBuilder()
  48. .withQuery(builder)
  49. .withHighlightFields(highlightFields)
  50. .withPageable(pageable)
  51. .withSort(sort)
  52. .build();
  53. return searchQuery;
  54. }
  55. }

4.測試驗證

啟動項目,在Postman中,請求

http://localhost:8080/book/query 接口查詢書籍信息數據。查看接口返回情況。

使用Spring Boot + Elasticsearch + Logstash 實現圖書查詢檢索服務

我們看到接口成功返回數據。說明數據查詢服務創建成功。

最后

以上,我們就把使用Spring Boot + Elasticsearch + Logstash 實現完整的數據查詢檢索服務介紹完了。

原文鏈接:https://mp.weixin.qq.com/s/Y5Wq0Q8CAHgc_6aYHr7CTA

延伸 · 閱讀

精彩推薦
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
主站蜘蛛池模板: 美女被视频网站看免费入口 | 胸大的姑娘中文字幕视频 | 精品在线观看一区 | 秋葵视频成人 | 久久99re2在线视频精品 | 97伊人久久精品亚洲午夜 | 国产精品免费视频一区一 | 欧美理论片手机在线观看片免费 | 狠狠色狠狠色综合婷婷tag | 亚洲欧美综合人成野草 | 亚洲精品国产精品国自产观看 | 网站视频免费 | 日韩国产欧美视频 | 国产亚洲精品一区久久 | 男人把大ji巴放进女人小说 | 手机看片国产免费久久网 | 日本艳鉧动漫1~6完整版在 | 日本丰满www色 | 国产馆精品推荐在线观看 | 91久久精品国产亚洲 | 亚洲高清中文字幕精品不卡 | 精品国产美女AV久久久久 | 亚洲国产成人资源在线桃色 | oneday日本在线观看完整版 | 欧美日韩免费一区二区在线观看 | 免费一级欧美片在线观看 | 精品视频在线免费看 | 国产国语在线播放视频 | 金牛网155755水心论坛黄大父母 | 五月天网站 | 男人与雌性宠物交啪啪小说 | 日韩视频在线精品视频免费观看 | 色哟哟在线播放 | 亚洲欧美在线免费 | 亚洲国产日韩欧美mv | 40分钟在线观看免费 | 北条麻妃黑人正在播放 | 日本伊人色 | 亚洲福利在线观看 | 日韩免费视频一区 | 9 1 视频在线 |