題記
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、架構設計
編碼之前,設計先行。一圖勝千言,核心架構設計圖如下所示:

架構層面要考慮的核心工作:
1、子產品劃分
可分為幾個子產品:爬蟲子產品、同步子產品、存儲檢索子產品、可視化子產品。
2、資料流
爬蟲->Mysql->logstash->ES->Kibana
3、資料ETL
日報資料算是半結構化資料,需要自定義正則解析、抽取後才能做分析用。
日期字段的時區原因,需要借助logstash filter進行日期格式轉換。
4、資料存儲模組化
一方面:同步資料格式的定義;
另一方面:為後續可視化做資料鋪墊。
3、爬蟲子產品
3.1 抓包分析網頁
步驟1:根據需求,結合postman抓包分析日報子產品的請求和傳回内容。
步驟2:評估核心字段(标題、URL、編輯、釋出時間等)是否好擷取。
3.2 日報解析
Java + Jsoup + 正則 分頁解析、并構造出字段資訊。
記錄了第幾期日報字段,且給每一篇文章構造定義了唯一id。
3.3 日報入庫
寫入Mysql。
坑1:日期字段設定timestamp,避免精度損失,影響後面的分析。
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、可視化子產品
關于title 詞頻統計,對應上圖的左上角:詞雲和如下的細化詞頻統計。
日報在:搜尋、分析、實踐、性能、監控方面都有大量的中英文優秀精選文章。
其他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)複雜度擷取想要的日封包章。
銘毅天下——Elasticsearch基礎、進階、實戰第一公衆号