《Elastic Stack 实战手册》——四、应用实践——4.1 企业搜索应用场景 ——4.1.1.Elasticsearch 在舆情搜索中的实践(中) https://developer.aliyun.com/article/1226421
典型业务场景
情绪走势
通过“情绪走势”图,可以看出一个舆情事件,在一段时间,不同情感表达上的数据分布情况,为了方便使用 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 算法在内容分析领域落地等。