天天看點

實戰 | ELK實作全量Elastic日報(2017-2019)多元度可視化分析

題記

Elastic社群主席M大、Elastic源碼解析書作者超哥都曾多次強調Elastic日報是非常好的學習資料,然後呢?

Elastic日報自2017年7月30日釋出第一篇文章,截止2019年6月6日,近10位責任編輯累計貢獻了1653篇文章。

日報分散在社群文章專區,全部看完至少需要翻頁40次+(每頁18條資料,還需要過濾掉非日封包章),檢索相對不友善。

能不能把Elastic日報爬取并導入Elasticsearch,借助ELK實作分析呢?

好想法,開搞!很期待~~

1、需求

當成一個小項目處理,自定義下需求。

想象一下,導入Elastic日報能在Kibana做哪些分析呢?

1)title 詞頻統計

2)編輯釋出文章統計

3)2017,2018,2019日報量統計

4)日報按月統計

5)編輯發日報時間按區間統計

6)關鍵詞檢索,如:性能、設計、優化、實戰等

7)…

的确,有了資料,能實作N多分析!

2、架構設計

編碼之前,設計先行。一圖勝千言,核心架構設計圖如下所示:

實戰 | ELK實作全量Elastic日報(2017-2019)多元度可視化分析

架構層面要考慮的核心工作:

1、子產品劃分

可分為幾個子產品:爬蟲子產品、同步子產品、存儲檢索子產品、可視化子產品。

2、資料流

爬蟲->Mysql->logstash->ES->Kibana

3、資料ETL

日報資料算是半結構化資料,需要自定義正則解析、抽取後才能做分析用。

日期字段的時區原因,需要借助logstash filter進行日期格式轉換。

4、資料存儲模組化

一方面:同步資料格式的定義;

另一方面:為後續可視化做資料鋪墊。

3、爬蟲子產品

3.1 抓包分析網頁

步驟1:根據需求,結合postman抓包分析日報子產品的請求和傳回内容。

步驟2:評估核心字段(标題、URL、編輯、釋出時間等)是否好擷取。

3.2 日報解析

Java + Jsoup + 正則 分頁解析、并構造出字段資訊。

記錄了第幾期日報字段,且給每一篇文章構造定義了唯一id。

實戰 | ELK實作全量Elastic日報(2017-2019)多元度可視化分析

3.3 日報入庫

寫入Mysql。

坑1:日期字段設定timestamp,避免精度損失,影響後面的分析。

實戰 | ELK實作全量Elastic日報(2017-2019)多元度可視化分析

4、同步子產品

借助logstash_input_jdbc實作Mysql到ES的同步。

坑1:為便于後續字段的自定義分析,務必不要使用動态映射,全部字段提前自定義。下一節詳細論述。

坑2:同步ES後預設時區為ETC,釋出時間會比實際落後8小時。需要filter階段處理。

核心處理如下:

filter {
  date {
    match => ["publish_time", "yyyy-MM-dd HH:mm:ss"]
    target => "publish_time"
    timezone => "Asia/Shanghai"
  }
 ruby {
   code => "event.set('timestamp', event.get('publish_time').time.localtime + 8*60*60)"
 }
 ruby {
   code => "event.set('publish_time',event.get('timestamp'))"
 }
 mutate {
   remove_field => ["timestamp"]
 }
}           

5、存儲分析子產品

最核心就是Mapping的定義。如前分析,要自定義Mapping各字段,不要使用預設動态的Mapping。

原因1、string類型全部解析為:text和keyword,實際我們不一定需要,會浪費存儲空間。

原因2:采用預設分詞器analyzer,實際我們需要自定義分詞:采用中文ik分詞,使用ik_max_word或者ik_smart進行自定義分詞。

為便于後續擴充和維護,使用template、alias實作。

坑1:第一次導入分詞結果不理想,可能會有大量的停用詞。比如:1、2、3、的、你、日、中、在、與、來、一、二、三、到等。
處理方案:在stopword.dic添加如上關鍵詞,重新開機ES,重建索引并再次導入資料。           
坑2:text類型的字段聚合。
處理方案:定義索引Mapping的時候,指定"fielddata": "true",           

推薦閱讀:

Elasticsearch詞頻統計實作與原了解讀

6、可視化子產品

實戰 | ELK實作全量Elastic日報(2017-2019)多元度可視化分析

關于title 詞頻統計,對應上圖的左上角:詞雲和如下的細化詞頻統計。

實戰 | ELK實作全量Elastic日報(2017-2019)多元度可視化分析

日報在:搜尋、分析、實踐、性能、監控方面都有大量的中英文優秀精選文章。

其他3張圖,對應需求2)編輯釋出文章統計、3)2017,2018,2019日報量統計、4)日報按月統計趨勢圖。

針對需求5)編輯發日報時間按區間統計,實踐一把:

POST  es_daily_info/_search
{
  "size": 0, 
    "aggs" : {
        "time_range" : {
            "range" : {
                "script" : {
                    "source": "doc['publish_time'].date.getHourOfDay()",
                    "lang": "painless"
                },
                "ranges" : [
                    { "from":0, "to" : 6 },
                    { "from" : 6, "to" : 20 },
                    { "from" : 20, "to": 24}
                ]
            }
        }
    }
}

傳回結果如下:

 [
        {
          "key" : "0.0-6.0",
          "from" : 0.0,
          "to" : 6.0,
          "doc_count" : 21
        },
        {
          "key" : "6.0-20.0",
          "from" : 6.0,
          "to" : 20.0,
          "doc_count" : 1524
        },
        {
          "key" : "20.0-24.0",
          "from" : 20.0,
          "to" : 24.0,
          "doc_count" : 108
        }
      ]           

可以看出: 有21篇文章是淩晨以後發的,有108篇是晚上8點到晚24點釋出的。(辛苦各位日報編輯了!)

針對需求6):

一個檢索語句搞定:Elasticsearch+性能優化幹貨文章,比Google搜出來的靠譜。

因為:這些文章都是編輯們人工篩選的,可謂是優中選優。

POST  es_daily_info/_search
{
  "_source": {
    "includes": ["title","url"]
  },
  "query": {
    "match_phrase": {
      "title": "性能優化"
    }
  }
}           

7、小結

資料擷取是整個小項目的最核心一環,有了資料,展開多元度的分析不再是難事。

目前網際網路環境下,Elasticsearch學習資料網上一搜會是一籮筐,但搜尋引擎畢竟是根據相關度推薦,到實際業務可用還有差距。

Elastic日報不同點核心在于人工精選,優中選優。如果你還在為學習資源發愁,不妨過一遍。

本文的實作,就是對日報資源抽絲破繭、條分縷析的對每條資料建立反向索引,可極大提高Elastic學習和實戰的效率。

8、禅定時刻

其實,Elastic中文社群完全可以上線日報搜尋功能,友善大家O(1)複雜度擷取想要的日封包章。

實戰 | ELK實作全量Elastic日報(2017-2019)多元度可視化分析

銘毅天下——Elasticsearch基礎、進階、實戰第一公衆号