龚永罡 吴 萌* 廉小亲 田润琳 夏 天
1(北京工商大学计算机与信息工程学院食品安全大数据技术北京市重点实验室 北京 100048)2(中国人民大学信息资源管理学院 北京 100872)
继国务院2009年发布《政府信息公开目录系统实施指引》后,2016年国务院更进一步推进了决策、执行、管理、服务、结果公开,加强政策解读、回应社会关切、公开平台建设等工作[1],要求在2018年底前,国务院各部门应全面完成本部门本系统主动公开基本目录的编制工作,并动态更新,每年要对未公开的信息以及依申请公开较为集中的信息进行全面自查,各级政府办公厅要定期抽查,对发现的应公开未公开等问题要及时督促整改,严格落实公开前保密审查机制,妥善处理好政务公开与保守国家秘密的关系,不断提升主动公开的标准化和规范化水平[2]。因此,开发一个规范标准,便于维护的政府信息公开系统,是各级政府网站宣传部门的一个很重要的工作。
公开信息大多是公文和附件等非结构化文档,传统基于数据库与文件系统的开发方式工作量大、开发周期长、过程复杂、维护困难。针对这一难题,本文提出了一种基于内容库来开发政府信息公开系统的新方案。信息公开的非结构化文档存储在内容库中,由内容库负责它的存储和管理。公开系统依据功能要求,通过内容库的标准CMIS接口来实现公开系统的各项功能。新方案降低了文档管理和文档使用之间的耦合度,减小了开发难度,降低了开发周期和维护成本。
关系型数据库中存储和管理的是二维结构的表对象。不同于传统的关系型数据库,内容库(Content Repository,CR)[3]存储和管理对象是被称为非结构化的数据,各种文件,视音频数据、图像数据、大文本数据是这类数据对象的典型代表[4-5]。内容库对内容提供统一的访问控制、锁定、事务、版本控制以及搜索,允许应用程序独立地通过标准接口访问,其中一个关键特性是:它不关注数据是如何存放的,不管数据存放在数据库、文件系统、还是XML文件,应用程序都可以对数据文件进行访问控制、查询、版本控制、锁定等[6-7]。
随着内容管理应用程序的日益普及,遵循内容仓库标准,提供标准化API的内容库需求已凸显出来。早在2005年,Java联盟机构就提出了一套操作内容库的Java标准API,即JCR(Java Content Repository)标准[8-9]。JCR的提出降低了内容管理系统实现的复杂度,提高了系统的可维护性[10-11]。但JCR只能在Java环境中使用,开发语言和平台受到了很大的限制。2010年10月,由IBM、Oracle、EMC、Microsoft、Alfresco等公司共同参与制定了新一代内容库标准——CMIS(Content Management Interoperability Services)[12]。CMIS的设计目的是定义一个完全和语言、平台无关的,通过Web直接访问的调用接口[13]。CMIS标准规范定义了一个核心域模型,持久性的信息实体对象构成了一个典型的CMIS的域,包括文档、文件夹、关系和策略[14]。CMIS指定了一套基本的服务,应用程序可以使用它来访问和操纵这些实体。由于其中涵盖了大多数的内容,所以文档、文件夹两个类型最为重要。CMIS文档和文件类似,它含有保持文档元数据的属性,例如:文档作者、类型和专有自定义属性等。如图1所示,CMIS文件夹是CMIS文档和其他CMIS文件夹的容器。文件夹可以决定它们能包含何种类型的文档[15-16]。文档可以被放在多个文件夹中,或者不在任意文件夹中。
图1 CMIS文件夹
在编制政府信息公开目录中,有几个比较重要的概念,即:核心元数据、索引码、索引号编码、内容概述、信息分类体系等。核心元数据是描述政府信息的关键属性,每条政府信息起码应该有四个核心元数据,分别为索引号、名称、生成日期、内容概述。编制政府信息公开目录最重要的工作是编制核心元数据,需要制定既适合国办需要,又能扩展的核心元数据定义方案,最后一共设定了12个元数据,其中有8个必选项、3个可选项、1个条件可选项。这12个元数据包括索引号、标题、内容概述、发布日期、有效期、文号、相关信息、发布机构、关键词、信息分类、获取方式、著录日期。12个元数据从多个角度对数据进行了刻画,有了这些元数据会使政府信息检索、使用的效率大大提高[17]。
展示目录的形式就是目录格式,一般分为三级,即一级目录、二级目录、三级目录。在一级目录中,每条政府信息的主要核心元数据占一行,可以同时看到很多政府信息的基本内容,通常应包括标题、发布日期、文号等主要核心元数据。其突出优点是显示清楚、一目了然。二级目录,即预览简要模式,包含的核心元数据比一级目录多一些,可同时包括索引号、内容概述、相关信息、获取方式、主题关键词等。二级目录可以帮助公众更多地了解政府信息的详细情况。三级目录是政府信息的全面展示。
根据这个思路,政府信息公开系统主要由管理子系统和服务子系统这两个部分构成。其中管理子系统是对政府即将公开的信息文件进行汇总、整理、加工。从原始文件中提取出要公开文件的主要属性,即核心元数据和拟公开的全文,并以json的格式发送给服务子系统并通过浏览器进行解析。服务子系统的主体是公众,通过浏览器和互联网向公众提供信息检索,在线浏览政府的公开信息以及相应的文件与附件的下载与打印服务。服务子系统主要提供检索、分类和导航等服务。通过互联网下载和打印政府信息,使公众能够快速、方便地访问和获取政府信息。其总体框架如图2所示。
图2 政府信息公开系统的构成
本系统基于内容库特性与政府信息公开系统的建设依据进行设计。政府信息公开系统发布的内容包括word、excel或PDF等,使用内容库作为系统的核心可以很好地契合政府信息公开系统的需要,整体设计上分为前端服务子系统和后台管理子系统,服务子系统提供公开信息展示和相应功能的开发,涵盖了信息检索、分类导航、信息展现、公开文件及附件的下载打印等模块的开发设计。管理子系统的开发,包括了信息管理、类目管理、目录管理、元数据管理等功能的开发设计。管理子系统通过CMIS的Web服务接口与内容库进行交互。系统整体设计架构如图3所示。
图3 系统的整体架构
元数据设计是基于内容库的政府信息公开系统的核心部分,这里元数据的概念是抽象的,它是数据结构和意义的描述,也是非结构化数据向结构化数据转换的描述,例如一个文件的名称、文件类型、大小、创建时间、创建人等都是对文件进行描述的元数据,通常使用XML格式标记语言来编写。XML标记语言可以很好地把数据结构和其显示方式通过不同标签分离开,是现在主流编写元数据的主要语言[18]。内容库支持自定义规则属性,其对政府信息公开系统的元数据的开发提供了极大的便利。最终展示给用户的公开文件的属性仅需要通过相关接口抽取内容库中其文件的元数据进行显示即可。
自定义元数据属性,通过在ContentModel.xml文件中自定义属性property即可。例如:
针对政府信息公开系统的特征,及《政府信息公开目录系统实施指引》对政府信息公开系统元数据的要求,系统需涵盖14个核心元数据,其中有六个必选项、三个条件必选项、五个非必选项。其公开文件的元数据设计如表1所示。
表1 系统元数据设计表
续表1
基于内容库的CMIS接口均是以Web服务技术开发。提供两种调用方式:一种是传统的Web Service,一种是RESTful风格的Web调用。本系统的接口设计采用更加简单轻量的RESTful方法设计和实现。每一个接口都是一个绑定到URI的服务,它响应GET、POST、PUT和DELETE等HTTP方法,并且提供了对内容库中内容的REST式访问。借助RESTful接口,可以很容易将内容库中的任意内容映射到Web上的资源。开发一个内容库与管理子系统相互访问的接口需要三步,在Web Scripts Extensions文件夹下创建XML格式的描述文件、相应的ftl格式的模板文件和一个控制器文件,用于接收参数并通过Lucence检索内容库中的数据。主要的接口功能说明、请求方式、所需参数以及返回结果如表2所示。
表2 系统主要的接口设计
管理子系统的实现包括原始信息的采集、元数据的抽取和标引、公开文件的校对审核。管理子系统应当实现对政府公开信息采集、加工、编审、入库的全程控制。同时还应该具有整体的流程管理、用户权限管理、信息公开系统的元数据管理等辅助功能。其实现流程如图4所示。
图4 管理子系统的实现流程
管理子系统需先对公开信息进行采集形成原始文件。政府公开信息的采集渠道和方式主要有三种:一是相关政府或是行政机关已在网站上公开的信息,但按照规定应该纳入政府信息公开目录里,对于这种信息,可以使用从相关机构或行政机关的网站上自动爬取信息的方法实现采集。二是政府行政单位内部业务系统中已经产生应公开但还尚未公开的政府信息,这种信息可以使用内部业务系统中的接口,以数据交换的方式实现采集。三是尚未形成电子数据的政府公开信息,这种信息使用以人工的形式进行录入。形成原始文件后需要判断文件类型,其属于公开文件还是附件,若是公开文件,则需对公开文件进行元数据的抽取,若是附件,则需要绑定其对应的公开文件。对于公开文件,可以使用元数据提取器来检查文件,提取元数据并将元数据保存在节点的属性中。元数据提取器是配置为Spring bean的Java类,可以在内容库创建内容时调用,也可以通过规则操作调用提取器。由于元数据提取器声明了它们支持的MIME类型,所以内容库知道哪个提取器用于给定的内容,通过配置规则调用元数据提取器,即可对公开文件的标题、文号、发布机构等元数据实现自动抽取。抽取属性后需进行人为的完善工作,即对公开文件中未涉及的属性进行人为的完善扩充。不管是公开文件还是附件最后都需创建索引才能最终入库,内容库内置的Lucene引擎会对内容进行索引的创建,并存入索引库。Lucene的使用为内容库提供了高效的数据查询索引,对系统的搜索服务提供了巨大的帮助。最后实现入库,其中元数据保存在关系型数据库中,而内容文件和Lucene索引则保存在文件系统中。
服务子系统主要是通过互联网为公众提供政府信息公开的相关服务,使公众能快速、便捷地查阅、获取、申请公开信息,其实现流程如图5所示。
图5 服务子系统的实现流程
服务子系统的受体为广大的人民群众,公众可以在政府网站上浏览相关的公开信息或提交申请以浏览其想要看到的公开文件。对于公众浏览的公开信息应有以下服务:用户可以查看或点击分类目录,分类目录下对应着相关的公开文件,当用户点开公开文件时,应可在线预览,并提供公开文件与其附件的下载功能。对于核心元数据应在目录项的基本信息中予以显示。用户在浏览政府信息公开网站的同时,点击相应主目录或是子目录、公开信息、检索关键词等即会调用后台的API进行数据的传输与交换。作为系统前台的开发,需要JQuery、AJAX、html等前端技术。当用户进行上述操作时,政府信息公开系统前台会通过AJAX技术将要传递参数以JSON的格式送入定制好的webscript接口中,在相应的接口控制器中调用lucene引擎检索出结果,最后再将要返回的数据封装成JSON的格式返回到政府信息公开系统的前台,通过JQuery的AJAX方法解析并呈现给用户。这里用到了前面所设计的四个接口。当用户查看分类目录时,实际调用了检索“政府信息公开目录”文件夹下的类型为文件夹的对象接口。当用户进行下载功能时,实际调用了下载功能的接口,所需参数的值为下载的链接地址,其为公开文件的一个属性。当用户查看一级目录或二级目录下的所有文章列表时,实际上调用了检索相应子文件夹类型为“内容”的全部对象。通过相应的接口控制器,与内容库进行数据交互。
政府信息公开系统的查询子系统支持原生的Lucene查询、XPath查询、全文查询,以及CMIS查询语言,如图6所示。
图6 信息检索子系统
默认情况下,内容库会将节点存储在关系型数据库中,而内容则是存在硬盘的文件系统中。使用一个数据库抽象层与数据库进行交互,从而使存储引擎可以从复杂的SQL连接语句中独立出来,简化了数据库移植工作,使得内容库可以基于各种主流数据库实现。查询字符串使用了Lucene查询语法来查找内容基于全文内容、属性值、路径和内容类型。使用Lucene的查询主要分以下几步:首先验证启动一个会话,之后对搜索的节点进行参考获取,然后使用Lucene的查询字符串建立查询对象,最后执行查询并转储结果。
定义一个操作类DataQueries类,这个类中可以接受文件夹或文件的名称作为参数。在类中定义两个方法:getQueryResults() 和doExamples()。getQueryResults()是一种通用的方法,执行一个指定的查询字符串,并返回一个ContentResult对象的列表。其中ContentResult是一个内部类,它作为辅助用于管理查询结果的属性。doExamples()方法调用getQueryResults()多次以显示不同的搜索字符串的例子。
本文提出并实现了一种基于内容库的政府信息公开系统,相较于传统的基于数据库和文件系统的信息公开系统开发模式,新方案具有层次清晰、易于实现,耦合度低、便于维护的优点,节省了设计与开发的时间周期。进一步研究可以扩展标准的CMIS接口规范,提供更多的调用模式,将内容库作为企业统一的非结构化资源存储库,独立存储和管理非结构化文档,为众多的业务系统提供内容资源支持。