
創作人:王歡
審稿人:楊振濤
業務背景
網絡輿情監測,主要是利用網際網路資訊采集技術,以及自然語言處理等智能資訊處理技術,通過對網際網路公開資料進行自動化抓取,然後對資訊進行結構化、自動分類、文本聚類、主題發現與跟蹤等,提供資訊檢索、多元度統計、敏感資訊預警、資訊簡報、自動化報告等功能,幫助使用者及時發現危害品牌形象的觀點,并為使用者分析關注對象在網絡中的形象提供依據。
在輿情 SAAS 系統(以下簡稱:輿情系統)中,使用者設定關注的關鍵詞,就可以快速檢索對應的輿情資料,以及對提及關鍵詞的資料提供統計圖表,包括輿情走勢、詞雲圖、情感分布、情緒走勢等。
這裡的資訊檢索與統計,都離不開 Elasticsearch(以下簡稱:ES)的 Query 以及 aggregation功能,下面詳細介紹如何使用 Elasticsearch 實作這些功能,以及在實踐過程中遇到的一些問題及解決方案。
輿情系統多元度檢索
索引設計
采集的資料源包括微網誌、微信、新聞網頁、論壇、自媒體平台、短視訊等平台的資料,每天新增去重資料量在 1億+,每條資料在經過結構化,以及經過 NLP(自然語言處理)之後,超過150 個字段,比如,文章标題、釋出時間、釋出作者、釋出平台、新聞分類、新聞提及地域、新聞情緒等。由于業務端需要對這些資料進行實時檢索,對不同平台的資料實時聚合,各平台的資料量分布也有很大的差異,是以按照平台進行拆分,而不是把所有的資料放到一個大的索引裡面。
由于不同平台的資料量差異很大,一般地,微網誌占每日總采集量的 80%,而新聞網頁、微信、自媒體平台的占比相對較少。為了避免由于索引的大小不一樣,導緻每個shard的差異過大,最終導緻落在不同節點上 shard 占用空間分布不均勻而出現資料傾斜。
是以,在實作上對微網誌的索引按照日期做了進一步拆分,微網誌每日一個索引,而自媒體平台每月一個索引。
索引劃分示意圖
為了友善業務檢索,對按天分索引的微網誌設定别名,比如
alias weibo_202101
對應weibo_20210101,weibo_20210102,...,weibo_20210131
分詞器設計
索引膨脹對比
不同于英文分詞器,大部分使用空格作為分隔符。針對不同的檢索場景,中文有更多的分詞器可供選擇,不同中文分詞器的選擇,會有索引大小,檢索性能,以及檢索資料的召回率與準确率上的不同。
不同分詞器的磁盤占用對比
在同樣的資料條件下,通過對不同分詞器下索引占用磁盤空間對比,我們發現:
- IK(ik_max_word)分詞器,占用磁盤空間最小
- Standard分詞器,與 ik_max_word 相差不大,比 ik_max_word 分詞方式隻增加了 5% 左右
- N-gram 占用空間比較大,相對于 ik_max_word, 當 n=3,4,5 時,占用空間,分别是ik_max_word 的 2倍、3倍、4倍 左右。
檢索性能對比
不同分詞器的檢索耗時對比
在同樣的資料條件下,通過對不同的分詞下檢索性能的對比,我們發現:
- IK(ik_max_word)分詞器,檢索性能是 standard 分詞器的 2-3倍 左右
- N-gram(n=5)分詞器,檢索性能是 standard 分詞器的 7倍 左右,是 ik_max_word 分詞器的 3倍 左右
通過綜合對比,雖然 n-gram(n=5)分詞器具備更高的檢索性能,但是占用更多磁盤空間,在輿情業務上,索引是百億級别(保留近3個月),基于成本考慮,這裡選擇了 ik_max_word 分詞器。
基于 Elasticsearch 的資料中台
系統架構圖
整個資料中台也是分層的架構體系,分為:
- 資料接入層
- 消息總線
- 資料處理與存儲層
- 資料索引層(Elasticsearch 叢集)
- 智能網關層
- 業務接入層
這裡重點介紹資料索引層與智能網關層。
資料索引層
在資料索引層,按照業務特點,以及成本綜合考慮。分為近 2年 資料的冷資料叢集,以及近 3個月的熱資料叢集。
- 冷資料叢集,選擇價格相對低廉的 SAS 盤作為索引的存儲媒體, 提供離線的資料下載下傳,以及對響應時間不敏感,且時間周期跨度較長的檢索、聚合統計等。
- 熱資料叢集,選擇 SSD 盤作為索引的存儲媒體,每個節點 16C、64G 記憶體, 為了降低運維成本,以及動态擴縮容,我們選擇了 阿裡雲Elasticsearch 服務。
在索引設計方面,根據業務特點,經常要檢索特定平台的資料,對索引按照文章釋出平台,以及釋出日期做了拆分,使每個索引不至于過大,以及導緻每個節點上的資料分布不均勻。提高磁盤的使用率與檢索性能。
智能網關層避免了業務端直連 Elasticsearch,無法做到通路并發限制,以細粒度的權限限制。智能網關主要解決了一下幾個痛點:
1、并發控制
網關為每個業務配置設定對應的獨立的 TOKEN,并且設定相應的 QPS,防止某個業務的高頻通路,影響了其他業務的通路,最終因為級聯效應, 導緻整個 Elasticsearch 叢集無法提供服務。另外, 網關提供了熔斷限流的功能,在ES叢集負載比較高的況下,對低優先級的 TOKEN 進行限流。
2、權限控制
網關為業務配置設定對應的權限,比如,讀寫權限、通路特定索引權限、查詢時間跨度權限等,對查詢語句進行解析,禁止通路超出權限的資料。
3、SQL 查詢
網關提供了 SQL 轉換成 DSL 的功能,通路業務端通過标準的 SQL 進行快速的查詢對應的資料,提高業務開發效率,降低使用ES的門檻。
4、動态路由
在索引設計階段,把索引按天、按照發文平台進行了拆分,為了友善業務端查詢,根據業務端查詢的時間段、發文平台,自動定位到對應的索引,業務端不用關心具體的索引名稱,提高業務端的開發效率, 同時,根據查詢時間範圍,動态查找對應的索引,并在查詢時指定到具體的索引,提高查詢的速度,避免無效的索引掃描。
5、降低更新成本
由于業務不是直連 ES,後端切換 ES 叢集,可做到業務端無感覺,降低了 ES 叢集的更新切換對業務端的影響, 降低了更新帶來的開發成本。
典型業務場景
情緒走勢
情緒走勢圖
通過“情緒走勢”圖,可以看出一個輿情事件,在一段時間,不同情感表達上的資料分布情況,為了友善使用 ES 的聚合統計功能,對每篇文檔的釋出時間,設定了
news_posthour
(文檔釋出時間所在的小時)備援字段,文檔的情緒
news_mood_pri
字段,通過在 DSL 中嵌套使用 aggregation ,就可以在一次查詢中獲得對應的圖表資料。
比如查詢在微網誌上與疫情相關的博文在某一天每小時的情緒走勢,查詢文法如下:
GET weibo_2021-04-08/_search
{
"query": {"bool": {"must": [
{"match_phrase": {
"news_title": "疫情"
}}
]}},
"size": 0,
"aggs": {
"NAME": {
"terms": {
"field": "news_mood_pri",
"size": 10
},
"aggs": {
"NAME": {
"terms": {
"field": "news_posthour",
"size": 24
}
}
}
}
}
}
通過上面的嵌套查詢 DSL 語句,就可以快速擷取到不同情緒分類下,每個小時段的資料量。
熱門主題詞
通過一個事件的熱門主題詞,可以直覺的了解到一個事件的大概内容。這裡也是通過 ES 的聚合功能實時擷取主題詞的統計資料。為了能夠實時擷取主題詞的統計資料,這裡用一個事件中提到每個主題詞的文檔數量,來當作主題詞的數量(相當于預設每個主題詞在文檔中隻出現一次),并沒有用每篇文檔的主題詞的絕對量。這樣做有一個好處,可以使用 ES 的 aggregation 功能實時聚合擷取統計資料,再配合 TF-IDF 算法,計算每個詞的相對權重。
在設定索引 schema 時,定義了
news_keywords_list
字段, 用于儲存單篇文檔的分詞結果清單,然後使用如下的文法,就可以快速統計每個詞對應的文檔數量:
GET weibo_2021-04-08/_search
{
"query": {"bool": {"must": [
{"match_phrase": {
"news_title": "疫情"
}}
]}},
"size": 0,
"aggs": {
"NAME": {
"terms": {
"field": "news_keywords_list",
"size": 10
}
}
}
}
通過上面的 DSL 語句,可以快速統計出高頻詞以及與其相關的文檔數量。
創作人簡介:
王歡,近 10 年内容大資料領域從業經驗,安徽雲計算産業促進會開發者工作委員會發起
人之一,阿裡雲 MVP。擅長高并發系統設計、資料中台建構等,目前在一家人工智能企
業擔任技術 VP,主要關注 AI 算法平台建構、AI 算法在内容分析領域落地等。
部落格:
https://juejin.cn/user/2981531263175213/posts