springboot集成elk 一: springboot + Elasticsearch

1.ELK介紹

1> Elasticsearch是實時全文搜索和分析引擎,node

提供蒐集、分析、存儲數據三大功能;git

是一套開放REST和JAVA API等結構提供高效搜索功能,可擴展的分佈式系統。github

2> Logstash是一個用來蒐集、分析、過濾日誌的工具。web

它支持幾乎任何類型的日誌,包括系統日誌、錯誤日誌和自定義應用程序日誌。spring

它能夠從許多來源接收日誌,這些來源包括 syslog、消息傳遞(例如 RabbitMQ)和JMX,它可以以多種方式輸出數據,包括電子郵件、websockets和Elasticsearch。數據庫

3>   Kibana是一個基於Web的圖形界面,用於搜索、分析和可視化存儲在 Elasticsearchspringboot

指標中的日誌數據。它利用Elasticsearch的REST接口來檢索數據,不只容許用戶建立他們本身的數據的定製儀表板視圖,還容許他們以特殊的方式查詢和過濾數據websocket

下載Elasticsearch 、Kibana、Logstashapp

 

2.ELK安裝

https://www.elastic.co/cn/downloads/socket

 

 

 

 

2.1啓動Elasticsearch

進入bin目錄cd elasticsearch / bin 執行.\elasticsearch

 

能夠修改集羣或節點名稱。在啓動 Elasticsearch 時從命令行完成,

./elasticsearch -Ecluster.name = my_cluster_name -Enode.name = my_node_name

 

測試:http://localhost:9200/

 

 

 

備註:關閉Elasticsearch 快捷鍵ctrl+c,而後輸入y

 

2.2 啓動kibana

修改配置 config/kibana.yml

 

 

 

 

進入bin目錄 cd kibana\bin 執行kibana

http://localhost:5601

 

 

 

備註:關閉kibana快捷鍵ctrl+c,而後輸入y

 

 

3.springboot + Elasticsearch

注意:springboot集成elasticsearch時,版本上必須一致才行

例如 個人springboot使用的時1.5.9版本,所以下載elasticsearch2.0  logstash-2.0.0 kibana4.2.0進行使用才行。

 

SpringBoot和Elasticsearch 之間對應版本的關係。

 

Spring Boot Version (x) Spring Data Elasticsearch Version (y) Elasticsearch Version (z)
x <= 1.3.5 y <= 1.3.4 z <= 1.7.2*
x >= 1.4.x 2.0.0 <=y < 5.0.0** 2.0.0 <= z < 5.0.0**

引入依賴:

<dependency>

      <groupId>org.springframework.boot</groupId>

      <artifactId>spring-boot-starter-data-elasticsearch</artifactId>

</dependency>

 

 

添加配置:

##es地址 spring.data.elasticsearch.cluster-nodes = 127.0.0.1:9300

 

實體類:

 

@Document(indexName = "test",type = "goods") //indexName索引名稱 能夠理解爲數據庫名 必須爲小寫 否則會報org.elasticsearch.indices.InvalidIndexNameException異常 //type類型 能夠理解爲表名

public class GoodsInfo implements Serializable { private static final long serialVersionUID = -7682211945335253642L; private Long id; private String name; private String description; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public GoodsInfo(Long id, String name, String description) { this.id = id; this.name = name; this.description = description; } public GoodsInfo() { } }

 

 


DAO: 

建立GoodsRepository,繼承ElasticsearchRepository,代碼以下:

 

import com.lolaage.system.model.GoodsInfo; import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; import org.springframework.stereotype.Component; @Component public interface GoodsDao extends ElasticsearchRepository<GoodsInfo,Long> { }

 

 

 


最後新建一個controller進行測試,包含簡單的增刪改查

 

@RequestMapping("/goods") @RestController public class GoodsController { @Autowired private GoodsDao goodsDao; //http://localhost:8888/save
 @GetMapping("/save") public String save(){ GoodsInfo goodsInfo = new GoodsInfo(123l, "商品"+123,"這是一個測試商品"); goodsDao.save(goodsInfo); return "success"; } //http://localhost:8888/delete?id=1525415333329
 @GetMapping("/delete") public String delete(long id){ goodsDao.delete(id); return "success"; } //http://localhost:8888/update?id=1525417362754&name=修改&description=修改
 @GetMapping("/update") public String update(long id,String name,String description){ GoodsInfo goodsInfo = new GoodsInfo(id, name,description); goodsDao.save(goodsInfo); return "success"; } //http://localhost:8888/getOne?id=1525417362754
 @GetMapping("/getOne") public GoodsInfo getOne(long id){ GoodsInfo goodsInfo = goodsDao.findOne(id); return goodsInfo; } //每頁數量

    private Integer PAGESIZE=10; //http://localhost:8888/getGoodsList?query=商品 //http://localhost:8888/getGoodsList?query=商品&pageNumber=1 //根據關鍵字"商品"去查詢列表,name或者description包含的都查詢
 @GetMapping("/getGoodsList") public List<GoodsInfo> getList(Integer pageNumber, String query){ if(pageNumber==null) pageNumber = 0; //es搜索默認第一頁頁碼是0
 SearchQuery searchQuery=getEntitySearchQuery(pageNumber,PAGESIZE,query); Page<GoodsInfo> goodsPage = goodsDao.search(searchQuery); return goodsPage.getContent(); } private SearchQuery getEntitySearchQuery(int pageNumber, int pageSize, String searchContent) { FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery() .add(QueryBuilders.matchPhraseQuery("name", searchContent), ScoreFunctionBuilders.weightFactorFunction(100)) .add(QueryBuilders.matchPhraseQuery("description", searchContent), ScoreFunctionBuilders.weightFactorFunction(100)) //設置權重分 求和模式
 .scoreMode("sum") //設置權重分最低分
 .setMinScore(10); // 設置分頁
 Pageable pageable = new PageRequest(pageNumber, pageSize); return new NativeSearchQueryBuilder() .withPageable(pageable) .withQuery(functionScoreQueryBuilder).build(); } }

 

 


  

測試

添加數據:http://localhost:8093/goods/save

 

 

 

查詢數據:http://localhost:8093/goods/getOne?id=123

 

 

 

 

在kibana上進行查看elasticsearch中的數據

 

根據測試代碼中IndexName : test建立一個模式匹配

點擊Settings-->Indices->去掉Index contains time-based events 的勾,

 

 

 

點擊Discover

 

 springboot-elk-dmeo.zip

相關文章
相關標籤/搜索