天天看點

ES 在輿情搜尋中的實踐- Elastic Stack 實戰手冊

ES 在輿情搜尋中的實踐- Elastic Stack 實戰手冊
https://developer.aliyun.com/topic/download?id=1295 · 更多精彩内容,請下載下傳閱讀全本《Elastic Stack實戰手冊》 https://developer.aliyun.com/topic/download?id=1295 https://developer.aliyun.com/topic/es100 · 加入創作人行列,一起交流碰撞,參與技術圈年度盛事吧 https://developer.aliyun.com/topic/es100

創作人:王歡

審稿人:楊振濤

業務背景

網絡輿情監測,主要是利用網際網路資訊采集技術,以及自然語言處理等智能資訊處理技術,通過對網際網路公開資料進行自動化抓取,然後對資訊進行結構化、自動分類、文本聚類、主題發現與跟蹤等,提供資訊檢索、多元度統計、敏感資訊預警、資訊簡報、自動化報告等功能,幫助使用者及時發現危害品牌形象的觀點,并為使用者分析關注對象在網絡中的形象提供依據。

在輿情 SAAS 系統(以下簡稱:輿情系統)中,使用者設定關注的關鍵詞,就可以快速檢索對應的輿情資料,以及對提及關鍵詞的資料提供統計圖表,包括輿情走勢、詞雲圖、情感分布、情緒走勢等。

這裡的資訊檢索與統計,都離不開 Elasticsearch(以下簡稱:ES)的 Query 以及 aggregation功能,下面詳細介紹如何使用 Elasticsearch 實作這些功能,以及在實踐過程中遇到的一些問題及解決方案。

ES 在輿情搜尋中的實踐- Elastic Stack 實戰手冊

輿情系統多元度檢索

索引設計

采集的資料源包括微網誌、微信、新聞網頁、論壇、自媒體平台、短視訊等平台的資料,每天新增去重資料量在 1億+,每條資料在經過結構化,以及經過 NLP(自然語言處理)之後,超過150 個字段,比如,文章标題、釋出時間、釋出作者、釋出平台、新聞分類、新聞提及地域、新聞情緒等。由于業務端需要對這些資料進行實時檢索,對不同平台的資料實時聚合,各平台的資料量分布也有很大的差異,是以按照平台進行拆分,而不是把所有的資料放到一個大的索引裡面。

由于不同平台的資料量差異很大,一般地,微網誌占每日總采集量的 80%,而新聞網頁、微信、自媒體平台的占比相對較少。為了避免由于索引的大小不一樣,導緻每個shard的差異過大,最終導緻落在不同節點上 shard 占用空間分布不均勻而出現資料傾斜。

是以,在實作上對微網誌的索引按照日期做了進一步拆分,微網誌每日一個索引,而自媒體平台每月一個索引。

ES 在輿情搜尋中的實踐- Elastic Stack 實戰手冊

索引劃分示意圖

為了友善業務檢索,對按天分索引的微網誌設定别名,比如

alias weibo_202101

對應weibo_20210101,weibo_20210102,...,weibo_20210131

分詞器設計

索引膨脹對比

不同于英文分詞器,大部分使用空格作為分隔符。針對不同的檢索場景,中文有更多的分詞器可供選擇,不同中文分詞器的選擇,會有索引大小,檢索性能,以及檢索資料的召回率與準确率上的不同。

ES 在輿情搜尋中的實踐- Elastic Stack 實戰手冊

不同分詞器的磁盤占用對比

在同樣的資料條件下,通過對不同分詞器下索引占用磁盤空間對比,我們發現:

  • 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倍 左右。

檢索性能對比

ES 在輿情搜尋中的實踐- Elastic Stack 實戰手冊

不同分詞器的檢索耗時對比

在同樣的資料條件下,通過對不同的分詞下檢索性能的對比,我們發現:

  • 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 的資料中台

ES 在輿情搜尋中的實踐- Elastic Stack 實戰手冊

系統架構圖

整個資料中台也是分層的架構體系,分為:

  • 資料接入層
  • 消息總線
  • 資料處理與存儲層
  • 資料索引層(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 在輿情搜尋中的實踐- Elastic Stack 實戰手冊

情緒走勢圖

通過“情緒走勢”圖,可以看出一個輿情事件,在一段時間,不同情感表達上的資料分布情況,為了友善使用 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 在輿情搜尋中的實踐- Elastic Stack 實戰手冊

通過一個事件的熱門主題詞,可以直覺的了解到一個事件的大概内容。這裡也是通過 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

繼續閱讀