文章

机器可读新闻(MRN)和N2_UBMS的比较和迁移指南

作者:

Warat Boonyanit
Senior Software Engineer Senior Software Engineer

机器可读新闻(MRN)和N2_UBMS的比较和迁移指南

 本文供希望从N2_UBMS新闻迁移到机器可读新闻(MRN)的路孚特RTO(Real-Time Optimized)和实时API开发者使用。它强调了N2_UBMS和MRN之间的主要区别,并举例帮助开发者了解如何用MRN替换N2_UBMS新闻。

 

N2_UBMS实时新闻

 本节将描述N2_UBMS的构造和实现。它旨在帮助那些可能没有N2_UBMS实时新闻背景知识的新开发者。有经验的开发者可以跳到下一节。

 

N2_UBMS概述

N2_UBMS是一个旧有的RIC,用于新闻广播信息。任何传入的新闻报道都会导致广播信息作为追踪(Update)传输到N2_UBMS RIC。然而,一篇新闻报道可以分许多部分。例如,报道的第一部分可能包括一个或多个快讯(Alert),这是一个简短的新闻标题,包含与新出现的新闻报道有关的最基本信息。在 快讯之后是简讯(Newsbreak),即报道的标题和一段文字,这段文字及其相关的标题被称为 "片段(Take)"。有可能出现一个以上的片段(Take),以便在有机会时提供更多的报道内容。

为了识别新闻报道的每一部分,该报道里所有传送的新闻将有一个共同的标识符,这个标识符被称为 "主要新闻访问代码"(PNAC)。

N2_UBMS上的每个广播信息都包含一组市场价格域(Market Price Domain)的字段,这些字段将在接下来的两节中列出。这些字段包含PNAC、标题、类别代码和时间戳,但不包含报道正文。

 一篇报道的主体被分成若干个文本段,每个文本段都有一个独特的标识符,作为检索用的RIC使用。第一个报道文本段的RIC总是PNAC,每个报道文本段都有指针,可以将各段链接在一起。消费者应用程序必须使用来自N2_UBMS的PNAC和随后的报道文本段RIC来检索报道的全部内容。

 一篇新闻报道也有一套类别代码,这些代码与广播信息一起传送。代码代表一则新闻的不同方面,包括产品代码、主题代码、公司代码和归属代码。产品代码用于鉴定用户是否被允许接收一则新闻,也为主题定义了一个广泛的范围,例如,“M”代表货币国际新闻服务。主题代码描述了新闻报道的主题,例如,‘INT’代表利率。公司代码识别受该则新闻影响的特定公司,例如,“LSEG.L”代表伦敦证券交易所集团。归属代码定义了一则特定新闻的来源。

 

广播信息中的字段用法

 

字段ID (FID) 字段名称 描述
3 DISPLY_NAME 识别信息子类型
235 PNAC 主要新闻访问代码
255 PROC_DATE 片段(Take)日期
259 RECORDTYPE 该值对新闻设为232。
264 BCAST_TEXT 标题文字
715 STORY_ID 用于检测信息丢失的顺序值
720 TAKE_SEQNO 信息序列号
725 ATTRIBTN 新闻来源
749 PROD_CODE 产品代码列表
750 TOPIC_CODE 主题代码列表
751 CO_IDS 公司代码列表
752 LANG_IND 语言指示符
1015 TAKE_TIME 片段(Take)时间
1024 STORY_TIME 新闻报道的时间
1027 STORY_DATE 新闻报道的日期

广播信息示例:

    	
            

UPDATE Item Name: N2_UBMS

Fid: 3 Name = DSPLY_NAME DataType: Rmtes Value: 2

Fid: 1 Name = PROD_PERM DataType: UInt Value: 7710

Fid: 235 Name = PNAC DataType: Ascii Value: nHKS1w6r3n

Fid: 255 Name = PROC_DATE DataType: Date Value: 7 / 7 / 2017

Fid: 259 Name = RECORDTYPE DataType: UInt Value: 232

Fid: 264 Name = BCAST_TEXT DataType: Rmtes Value: The quick brown fox jumps over the lazy dog

Fid: 715 Name = STORY_ID DataType: Ascii Value: n&1EVEmt01

Fid: 720 Name = TAKE_SEQNO DataType: UInt Value: 1

Fid: 725 Name = ATTRIBTN DataType: Rmtes Value: HIIS

Fid: 749 Name = PROD_CODE DataType: Rmtes Value: SHKI

Fid: 750 Name = TOPIC_CODE DataType: Rmtes Value: ASIA CMPNY CN EMRG ENER EQTY HK LEN RENE RENQ STX HIIS

Fid: 751 Name = CO_IDS DataType: Rmtes Value: 9999.HK

Fid: 752 Name = LANG_IND DataType: Rmtes Value: EN

Fid: 1015 Name = TAKE_TIME DataType: Time Value: 10:11:12:0

Fid: 1024 Name = STORY_TIME DataType: Time Value: 10:11:12:0

Fid: 1027 Name = STORY_DATE DataType: Date Value: 7 / 7 / 2017

PNAC和后续报道文本段信息中的字段使用:

字段ID (FID) 字段名称 描述
2 RDNDISPLAY 设为136
237 PREV_LR 前一个文本段的RIC
238 NEXT_LR 下一个文本段的RIC
254 UNIQUE_SN PNAC
255 PROC_DATE Take日期
256 PROC_TIME Take时间
258 SEG_TEXT 文本段里的报道内容
259 RECORDTYPE 该值对新闻设为232。
723 TAB_TEXT 表格式文本指示符
727 MORE_NEWS 用于标示是否预期更多的新闻
752 LANG_IND 语言指示符

后续报道文本示例:

    	
            

REFRESH Item Name: nL3N1J5319

Fid: 1 Name = PROD_PERM DataType: UInt Value: 511

Fid: 2 Name = RDNDISPLAY DataType: UInt Value: 136

Fid: 237 Name = PREV_LR DataType: Ascii Value: <BLANK>

Fid: 238 Name = NEXT_LR DataType: Ascii Value: n#1EaGva03

Fid: 254 Name = UNIQUE_SN DataType: Ascii Value: nHKS1w6r3n

Fid: 255 Name = PROC_DATE DataType: Date Value: 7 / 7 / 2017

Fid: 256 Name = PROC_TIME DataType: Time Value: 8:9:0:0

Fid: 258 Name = SEG_TEXT DataType: Rmtes Value: The quick brown fox jumps over the lazy dog

Fid: 259 Name = RECORDTYPE DataType: UInt Value: 232

Fid: 723 Name = TABTEXT DataType: Rmtes Value: X

Fid: 727 Name = MORE_NEWS DataType: Rmtes Value: R

信息类型存储在广播信息的FID 3中,包含一个数字。以下是每种信息类型的简要描述。

信息类型 FID值 备注
ALERT 1 尽快提供一则重要新闻的简短摘要。快讯只能用于尚无相关报道的新闻。
FIRST_TAKE 2 与新闻报道的简讯相关联。
SUBSEQUENT_TAKE 3 与简讯之后提交的额外报道相关联。
在旧系统中我们曾使用信息类型3,但现在这些信息在直播中被呈现为追踪(信息类型6)。
CORRECTION 4 修正,表示对小问题、拼写和以前传播过的琐碎细节进行纠正。
CORRECTED 5 更正,表示重要的事实被错误地传达,然后被纠正。
UPDATE 6 对新闻报道的自然追踪,可包括额外的上下文、反应、分析、背景或事实。
DELETED 7 一则新闻报道已经从新闻来源中删除,应该被立即删除,因为它是错误发送的,或者因为其它一些原因需要删除。

主要新闻访问代码(PNAC,广播信息的FID为235,请求/响应信息的FID为254)是一个8字节的字符串标识,用于识别一篇报道。报道文本段RIC(FID为237 PREV_LR和238 NEXT_LR)也是8字节的字符串,代表与报道文本部分相关的特定RIC。PNAC和报道文本段RIC都是24小时内唯一的。

类别代码提供了一种将新闻与每条新闻的额外信息联系起来的方法。这些代码分为三个不同的集合:FID 749的产品代码、FID 750的主题代码以及FID 751的公司代码。归属代码(FID 725 ATTRIBTN)表示新闻的来源。新闻的来源也作为产品代码输入FID 749。

这里包含两个时间戳,即报道(Story)的日期/时间和片段(Take)的日期/时间。报道(Story)的日期/时间(FID 1024 STORY_TIME和FID 1027 STORY_DATE)表示该条新闻首次出现的时间,而片段(Take)的日期/时间(FID 255 PROC_DATE和FID 1015 TAKE_TIME)表示收到这部分新闻片段的时间。

新闻标题和报道文本(FID 264和FID 258)是使用路透社的ISO2022编码实现的,称为“路透社多语言文本编码标准”(RMTES)。标题和报道文本包含在255个字节内,这是FID的最大长度。

 

机器可读新闻

目前,有四个MRN内容集可通过实时数据传输获得,但以前的N2_UBMS用户使用的应该是其中的实时新闻内容集。这个内容集的来源是路透社和几十个第三方新闻来源发布的快讯和报道。它包含标题、报道正文以及新闻发布时的相关元数据。

 

MRN数据模型

MRN使用新闻文本分析域(News Text Analytics Domain)RSSL消息中的开放消息模型(Open Message Model, OMM)包,通过实时数据传送专线发布。实时新闻内容集是通过MRN_STORY RIC提供的。内容数据包含在一个FRAGMENT(BUFFER类型)字段中,该字段已被压缩,并可能被分割成多个消息,以减少带宽和RSSL消息的大小。

数据要经过以下一系列的转换:

  •  一条核心MRN数据是一个UTF8的JSON字符串;
  • JSON字符串使用gzip进行压缩;
  •  压缩后的JSON字符串被分割成若干片段,每个片段都适合于一个RSSL更新(Update)。
  • 数据片段作为FieldList包中的FRAGMENT字段值被添加到更新消息中。

因此,为了解析核心内容数据,应用程序需要将这个过程倒过来。

以下五个字段以及RIC本身都是必要的,它们用以确定是否收到了整条数据的各个片段,以及如何将这些片段串联起来重建这条数据:

  • MRN_SRC:发布FRAGMENT的评分/处理系统的标识符。
  • GUID:该条数据的全球唯一标识符。这条数据的所有消息都有相同的GUID值。
  • FRAGMENT:压缩的数据片段本身。
  • TOT_SIZE:分片数据的总大小,以字节为单位。
  • FRAG_NUM:一条数据里各个片段的序列号。对于发布的每条数据的第一个片段,这个数字被设置为1;对于每条数据的后续片段,这个数字会被递增。

一条MRN数据发布是由RIC、MRN_SRC和GUID的组合来唯一标识的。

 

分段储存

 对于一个给定的RIC-MRN_SRC-GUID组合,当一条数据只需要一个消息时,TOT_SIZE将等于FRAGMENT的字节数,FRAG_NUM将是1。

当需要多个消息时,一旦每个FRAGMENT的字节数之和等于TOT_SUM,就可以认为该条数据已经完全收到。消费者还将观察到所有FRAG_NUM的范围是从1到片段的数量,没有跳过中间的整数。换句话说,一条通过三个消息传输的数据的FRAG_NUM值是1,2,3。

 

压缩

FRAGMENT字段是用gzip压缩的,因此需要消费者解压以显示该FID中的JSON明文数据。

当一条MRN数据通过多个消息发送时,所有的消息都必须被接收,并在解压前将各个FRAGMENT连接起来。换句话说,每个FRAGMENT不应该被单独解压。

解压后的输出以UTF-8编码,格式为JSON。

 

N2_UBMS和MRN实时新闻比较

正如概述中提到的,N2_UBMS的内容以市场价格(Market Price)域字段值对的形式出现,而MRN实时新闻的内容则以UTF-8 JSON的形式出现在新闻文本分析(News Text Analytics)域的FRAGMENT字段。

下表列出了消费者应用程序在使用二者提取数据之间的差异。

N2_UBMS MRN实时新闻
使用Market Price域 使用News Text Analytics域
请求RIC 请求RIC
收到包含标题和PNAC的更新消息 收到包含整条数据各个片段的更新消息
使用更新消息中的PNAC来请求报道正文的第一部分片段  
使用指针来请求后续片段  
将每个片段组成一篇完整的报道 合并片段
  解压gziped数据
  整个内容数据是JSON格式

由于News Text Analytics域是一个新的域,使用旧市场数据界面的API用户将不能使用这个域。建议旧有的API用户升级到OMM接口。

在N2_UBMS中,消费者应用程序必须提出多个请求来获取一篇报道的全部内容。首先,它需要请求RIC来获得标题和PNAC,然后使用PNAC来请求正文的第一部分。之后,它必须使用指向下一个片段的指针来获取后续的部分。但在MRN中,消费者只提出一个RIC请求。消费者收到包含数据片段的更新消息,这些数据片段需要合并和解压。MRN消费者需要一个能够解压gzip的压缩库。由于新闻报道的内容数据是JSON格式的,所以也需要一个JSON解析器。

 

字段映射

MRN实时新闻和N2_UBMS都包含相同的标题、报道正文和关于报道的相关元数据。下表将MRN实时新闻的字段映射到N2_UBMS的字段。

 

字段分类 总体描述 MRN_STORY N2_UBMS 备注
识别信息 条目ID Id   这两个字段有同样的值。
GUID GUID在FieldList包中,但不在核心JSON数据中。
主要新闻访问代码 altId PNAC  
Take序列号 takeSequence TAKE_SEQNO  
新闻来源 provider ATTRIBTN MRN_STORY以”NS:”为前缀。
新闻正文 标题 headline BCAST_TEXT  
报道正文 body SEG_TEXT MRN_STORY的值被转义以确保有效的JSON。
语言 language LANG_IND N2_UBMS使用大写字母。MRN_STORY使用小写字母。
时间戳 报道(Story)日期 firstCreated STORY_DATE  
报道(Story)时间 STORY_TIME  
片段(Take)日期 versionCreated PROC_DATE  
片段(Take)时间 TAKE_TIME  
标记

公司代码

(Company Codes)

subjects CO_IDS MRN_STORY以“R:”为前缀。
MRN_STORY可能还包含公司的PermID,以“P:”为前缀。

命名的条目代码

(Named Item Code)

instancesOf NAMED_ITEM MRN_STORY以“NI:”为前缀。

产品代码

(Product Codes)

audiences PROD_CODE MRN_STORY以“NP:”为前缀。

主题代码

(Topic Codes)

subjects TOPICS_CODE MRN_STORY以“N2:”为前缀。

条目分类

(Item Classification)

messageType DSPLY_NAME MRN messageType使用与N2_UBMS相同的枚举值。
urgency MRN urgency是一个不太具体的版本。

处理新闻

当一个有新闻价值的事件发生时,报道的第一部分可以是一条快讯(Alert),它是一条简短的包含事实和基本细节的大写标题。然后,在快讯发生几分钟之后,就会创建一条简讯(Newsbreak)。简讯由一个标题和几段正文组成,它们通常被归档为一个片段(Take)。然而,在某些情况下,有必要进一步添加文本或代码。

在N2_UBMS中,消息分类被定义在FID 3中。

在MRN中,消息分类被定义在messageType字段中,这是一个整数字段,使用与N2_UBMS的FID 3相同的枚举值。

在MRN中,一篇报道的所有片段应包含相同的主要新闻访问代码(PNAC)或altId。

处理新闻报道最常见的方法是用最新发布的消息覆盖共享altId的旧消息,丢弃快讯、简讯和之前的追踪。

 

校正

对于一篇特定的报道,所有的报道信息将共享相同的altId。

如果快讯(Alert)中有实质性的错误,该报道将使用一个新的PNAC发送,并在快讯标题的开头插入CORRECTED。

但是如果简讯(Newsbreak)中有实质性的错误,修正后的报道通常会以相同的PNAC发布。

 

撤回

如果一篇报道有根本性的缺陷,就会发送一条删除信息。

在N2_UBMS中,删除消息的分类是FID 3中的7。

在MRN中,删除消息在messageType字段中是7,在pubStatus字段中是”stat:canceled”。

应用程序应该从查看中删除该报道,同时从活动缓存中删除该报道。

 

参考资料

MRN数据模型