发明内容
针对现有技术中存在的缺陷,本发明的目的在于提供一种用于数据库信息检索的中间层系统及信息检索方法,中间层系统能接收基于http协议的检索请求,经过语法分析引擎解析后,能精确获取数据,满足大数据量且任意字段组合的查寻,数据库查寻时间短,数据层与应用层分离,数据层和应用层的开发互不影响。
为达到以上目的,本发明采取的技术方案是:
一种用于数据库信息检索的中间层系统,其特征在于,包括:
用于接收应用层发出的检索请求的API应用服务器群组,所述应用层发出的检索请求为一个符合URL规范的http地址,该http地址中包括用于在数据库中进行检索的相应的参数,
用于接收API应用服务器群组转发的检索请求的索引服务器群Sphinx Server,所述索引服务器群包括若干节点服务器Node IndexerServer,
用于接收API应用服务器群组转发的检索请求的在线数据库服务器群,所述在线数据库服务器群包括若干在线数据库群组,
离线数据库服务器群,通过数据交互通道与在线数据库服务器群进行数据同步,所述离线数据库服务器群包括若干离线数据库群组,
索引创建服务器,索引创建服务器跟据索引配置文件中指定的离线数据库群组得到数据来创建索引,索引创建服务器创建索引的过程,就是生成索引文件的过程,索引文件存储在索引创建服务器中,
索引服务器群中的各节点服务器从索引创建服务器中获取最新的索引文件。
在上述技术方案的基础上,所述API应用服务器群组包括若干APP服务器APP Server,每个APP Server中均设有服务软件,所述服务软件包括:用来接收http请求的服务软件nginx,用来管理php运行进程的服务软件php fpm,用来解析php脚本的服务软件php,服务软件用于完成接收请求和语法分析,此即语法分析引擎。
在上述技术方案的基础上,索引文件会放在索引创建服务器上的FTP服务目录下,通过服务器上的定时任务执行程序定时生成一个新的索引文件,并以文本方式记录本次生成的索引文件的版本号,新的版本号是上一次生成的版本号加一;
索引创建服务器同时安装了FTP服务,节点服务器通过FTP客户端命令,访问到FTP服务目录下的各个索引文件。
在上述技术方案的基础上,节点服务器每次从索引创建服务器下载索引文件,也会在本地记录当前节点服务器中所使用的索引文件的版本号,
节点服务器定时将本地当前节点服务器中所使用的索引文件的版本号与索引创建服务器上最新的索引文件的版本号对比,当小于时,则重新下载索引创建服务器上最新的索引文件。
一种基于上述的用于数据库信息检索的中间层系统的信息检索方法,其特征在于,包括以下步骤:
步骤1,MySQL在线数据库和离线数据库的内容是一一对应的,有一个在线视频库,就会有一个离线视频库,通过MySQL的主从同步复制功能,将在线数据库实时同步复制到离线数据库当中;
步骤2,MySQL离线数据库是专门供索引创建服务器使用的,索引创建服务器上安装sphinx的indexer程序,indexer程序会跟据对应的配置文件,生成索引,
所述配置文件包括数据来源参数,数据来源参数指向MySQL离线数据库,
sphinx的indexer程序定时生成索引文件;
步骤3,API应用服务器装有nginx、php-fpm和php,nginx用于接收到http请求,php-fpm负责调用php脚本,而php本身是用来解析语法分析引擎的程序;当服务器接收到http请求时,对http请求中的参数进行分析通过对q参数和ob参数进行分析,确定需要查寻哪些条件,将分析结果转换成sphinx可以识别的查寻条件,向索引服务器发送查寻请求,索引服务器跟据查寻条件,在索引中进行查寻,索引服务器将查寻后的文档ID返回给API应用服务器;
步骤4,API应用服务器得到文档ID后,通过分析http请求中的fd参数,确定需要返回哪些字段,然后利用刚刚得到的文档ID去MySQL数据库进行查寻需要返回的数据,所述文档id在mysql里为主键。
在上述技术方案的基础上,在MySQL在线数据库和离线数据库中,跟据业务需求按群组划分数据库。
本发明所述的用于数据库信息检索的中间层系统及信息检索方法,当用户通过应用层来检索(查询)数据表中的视频信息时,给出一个http地址作为请求发送到中间层,由中间层完成在数据库中检索视频信息,并将检索结果返回给应用层的工作。
本发明所述的用于数据库信息检索的中间层系统及信息检索方法,具有以下优点:
1.基于http协议
传统的数据库直接调用数据方式,与业务逻辑关系非常紧密,往往需要跟据业务需求,使用不同的数据库类型,并需要跟据业务层面需求来设计数据库结构和数据索引,当业务量不断扩展,其数据库也会随之变得复杂。简单的说,业务逻辑、数据存储、数据查寻索引三个方面是绑在一起的,任何一个有变化都会影响到其它两方面。本发明给出的用于数据库信息检索的中间层系统及信息检索方法,通过http方式调用数据,可以彻底将数据库层面和业务层面隔离开,而通过sphinx(一个基于SQL的全文检索引擎,可以结合MySQL、PostgreSQL做全文搜索,它可以提供比数据库本身更专业的搜索功能)索引服务,又将数据存储和索引分开,使业务逻辑、数据存储、数据查寻索引相对独立,互不影响。未来数据库不管是用mysql存储还是mongodb存储,都不会响业务层应用。
2.精确获取数据(相对于搜索引擎)
传统的搜索引擎,一般是通过关键字分词方式,在文本内容中进行全文查找,这种查寻返回的结果,主要依赖分词算法,但分词算法无论如何优化,都有可能搜索出来的结果并不是用户相要的。本发明给出的用于数据库信息检索的中间层系统及信息检索方法,可针对字段进行精确定向查寻,返回给果一定是前端所需结果,而非模糊搜索的结果。比如查找当天播放数大于1一万的视频,直接使用表达式day_vv:10000-,这有点像传统数据库的条件查寻语句whereday_vv>10000,但传统数据库必须在day_vv字段上加索引才能快速查寻。
3.数据层与应用层分离(单独开发互不影响)
上面已经提到,本发明给出的用于数据库信息检索的中间层系统及信息检索方法,由于使用http协议进行数据传送,增加字段或修改数据库结构等操作,对应用端来说都是透明的,应用层读取数据的方式永远都是通过http协议向接口请求数据,所以数据库层面的修改不会影响到应用层,这也使得数据层和应用层的开发互不影响。
4.统一的数据读取方法(协议)
传统的方法是应用层的程序要直接到数据库读取数据,这就需要知道数据库如何配置的,数据结构是怎样的等一些关于数据库的具体问题,而且,不同的数据库都不一样,应用层使用起来非常繁琐。本发明给出的用于数据库信息检索的中间层系统及信息检索方法,使用中间层接口读取数据,都是通过一个http地址请求获取数据,而且所使用的查寻表达式规范相同,这样不管是读取节目数据还是视频数据,查寻方法完全一样,所不同就是告诉接口要节目数据还是视频数据,有哪些字段等。对于前端应用来说,只要学会查寻表达式,就可轻易读取任何想要的数据,而不用关心数据库存储和索引等内容。开发效率和开发成本大大降低。
5.极好的性能
传统的数据库存储,数据读取往往由业务逻辑决定,时刻都要关心是业务逻辑需要的查寻,数据库是否能满足查寻需求,执行效率如何等一系列问题。本发明给出的用于数据库信息检索的中间层系统及信息检索方法,中间层由于使用独立的索引系统,将所有字段都进行了索引,所以通过中间层获取数据,字段查寻可以任意组合同时可以保证高效查寻。业务逻辑永远不用关心查寻效率问题,也不用关心字段查寻的先后顺序。举例来说,传统数据库有一张数据表A,表A中有三个字段F1、F2、F3,数据库在F1上有索引,假如该表有一千万数据,使用传统的查寻方式,查寻条件中只能对F1进行查寻,才能命中索引,查寻时间可以在0.1秒以内,如果对F2或F3或它们之间任意组合的查寻,由于无法命中索引,就需要全表扫描,其查寻时间从几分钟到几十分钟都是有可能的,这显然不能满足线上应用需求。而中间层由于使用了独立的索引服务,这一千万数据都是通过离线方式将F1、F2、F3全部创建了索引,而且索引都放在内存当中,这样业务层无论是查寻任何一个字段或组合,都可以命中索引,查寻时间都可控制在0.1秒以内。
具体实施方式
以下结合附图对本发明作进一步详细说明。
本发明所述的用于数据库信息检索的中间层系统及信息检索方法,主要用于视频网站为用户提供海量视频信息检索服务,或具有类似检索需求的场合,当用户通过应用层来检索(查询)数据表中的视频信息时,给出一个http地址作为请求发送到中间层,由中间层解析该http地址获得请求检索的相关信息后,完成在数据库中对视频信息的检索,并将检索结果返回给应用层的工作。
本发明不局限于视频信息检索服务,本发明给出的中间层系统的结构可以应用于几乎网站的所有内容,如看吧(优库社区产品),明星(明星库产品)等。本发明在目前优酷网站中,主要用于数据筛选、读取,不等同于传统的基于分词的搜索引擎,或理解为一种精确检索的搜索引擎。
在作为请求的http地址中包括相应的参数供中间层在数据库中进行检索。应用层、中间层、数据库(底层)三者的结构关系参见图2。所述的中间层包括访问协议,该访问协议是一种基于http的协议,是一个读取数据的规范。
中间层所完成的工作可划分为:
对底层(数据库),通过中间层创建数据表的索引,使其查寻效率非常高,应用层不用关心条件如何组合才能命中数据表索引,各种查寻条件完全可以自由结合,而中间层负责将这些分散在各数据表中的数据读取出来并进行封装,应用层只要告诉中间层要什么数据,中间层为其完成到各个数据库和数据表的查寻工作。
对应用层,提供一种简单、高效、统一的读取接口,应用层只需要按照中间层中的访问协议将参数拼装起来构成符合规范(URL规范)的http地址,即可获取到指定的数据。
如图1所示,本发明给出的用于数据库信息检索的中间层系统,包括;
用于接收应用层发出的检索请求的API应用服务器群组,所述应用层发出的检索请求为一个符合URL规范的http地址,该http地址中包括用于在数据库中进行检索的相应的参数,本发明中涉及的各参数详见后述,
所述API应用服务器群组包括若干APP Server(APP服务器),每个APP Server中均设有服务软件,所述服务软件包括:用来接收http请求的服务软件nginx,用来管理php运行进程的服务软件phpfpm,用来解析php脚本的服务软件php,服务软件用于完成接收请求和语法分析,此即语法分析引擎,语法分析引擎工作流程图参见图4,语法分析引擎可以理解为将http请求中的参数数据,解析成为sphinx服务api提供的查寻代码和反回对应于数据库字段信息的一个分析器,
用于接收API应用服务器群组转发的检索请求的索引服务器群Sphinx Server,
所述索引服务器群包括若干索引服务器(节点服务器)NodeIndexer Server,
用于接收API应用服务器群组转发的检索请求的在线数据库服务器群,
所述在线数据库服务器群包括若干在线数据库群组,在线数据库群组可以使用MySQL数据库,
API应用服务器群组从索引服务器群Sphinx Server获取所请求检索对象的对象身份标识号码ID(例如:请求检索对象为视频,则获取到的则为视频ID),再通过检索对象(视频)的ID从在线数据库服务器群获取最终的检索结果,对象的ID用于唯一标识请求检索的对象,和上面提到的一样不局限于视频ID,视频只是一个具体资源的示例,
离线数据库服务器群,通过数据交互通道与在线数据库服务器群进行数据同步,
所述离线数据库服务器群包括若干离线数据库群组,离线数据库群组与在线数据库群组使用相同的数据库,例如可以使用MySQL数据库,使用相同的数据库是为了便于进行数据同步,
索引创建服务器,索引创建服务器跟据索引配置文件中指定的离线数据库群组得到数据来创建索引,索引创建服务器创建索引的过程,就是生成索引文件的过程,索引文件存储在索引创建服务器中,
索引服务器群中的各节点服务器从索引创建服务器中获取最新的索引文件。例如:
索引文件会放在索引创建服务器上一个特定的目录(FTP服务目录)下,通过服务器(索引创建服务器)上的定时任务执行程序(例如:unix系统中的定时任务执行程序crontab)定时生成一个新的索引文件,并以文本方式记录本次生成的索引文件的版本号,版本号为正值(例如:1、2、100等正值),新的版本号是上一次生成的版本号加一。最终的目录文件类似于下面这样(以节目索引为例)
29504(以版本号命名的目录,其中存储与该版本号对应的索引文件,下同)
29505(目录)
29506(目录)
29507(目录)
29508(目录)
29509(目录)
version.show.master(记录最后版本号的文本文件,如29509是最后一个索引文件的版本号,则该文本文件中记录的内容可以为:VER_LAST=29509)
索引创建服务器同时安装了FTP服务,节点服务器通过FTP客户端命令,访问到FTP服务目录下的各个索引文件。
节点服务器每次从索引创建服务器下载索引文件,也会在本地记录当前节点服务器中所使用的索引文件的版本号,例如:在节点服务器中索引文件的目录中会有一个名为version.show.loc的文本文件,内容类似于VER_LAST_LOCAL=29508,记录当前节点服务器中所使用的索引文件的版本号。节点服务器同样可通过定时任务执行程序crontab程序,定时执行(如每3分钟执行一次)shell脚本(shellscript,利用shell的功能所写的一个程序,这个程序是使用纯文本本件,将一些shell的语法与指令写在里面,然后用正规表示法,管线命令以及数据流重导向等功能,以达到我们所想要的处理目的),所述shell脚本主要完成的工作是比较本地的索引文件的版本号是否小于索引创建服务器上最后的索引文件的版本号,如果小于,则从索引创建服务器上下载最后一个版本的索引文件覆盖本地的索引文件,实现索引文件的更新。以前述为例:本地的索引文件的版本号是29508,而索引创建服务器上最后的索引文件的版本号是29509,则需要更新。如果本地索引文件的版本号等于索引创建服务器上的最后的索引文件的版本号,则说明索引文件没有更新,则直接结束shell脚本不做任何操作。
上述中间层系统中各服务器的架构可按如下设置,所述架构是指环境及所用开发语言:
操作系统OS:CentOS 5.5(一个linux操作系统)
APP服务器APP Server:Nginx(用来接收http请求的服务软件)+php fpm(用来管理php运行进程的服务软件)+php(用来解析php脚本的程序)
索引创建服务器Index Server:sphinx(一个基于SQL的全文检索引擎)
分布脚本Distribute script:linux bash shell script(linux系统下的脚本语言)+php script(php脚本语言)
数据库database:MySQL(一种数据库)
使用中间层架构的要求:
进入中间层的资源,必须有一个唯一的对象身份标识号码ID(数字识别ID),所有字段或属性都是基于该ID之上,这是一种文档式数据结构。以视频为例,首先必须有一个视频ID,其它一切视频信息都可以作为属性存在,以视频为例,其结构类似如下,
ID
title(标题)
seconds(视频长度)
createtime(创建时间)
guest(嘉宾)
id(嘉宾ID,可关链到人物资源)
name(嘉宾名)
…
可以看出,对于视频资源的每个记录,都可以认为是一个文档“ID”,而文档“ID”下,记录着该视频资源的所有信息,例如:标题、视频长度、创建时间、嘉宾、嘉宾ID、嘉宾名等等。
以上述用于数据库信息检索的中间层系统为基础,本发明所述的用于数据库信息检索的中间层系统的信息检索方法,服务器间的工作流程包括以下步骤:
1.API应用服务器装有nginx、php-fpm和php,nginx用于接收到http请求,php-fpm负责调用php脚本,而php本身是用来解析语法分析引擎的程序。当服务器接收到http请求时,对http请求中的参数进行分析(分析过程后面有述),通过对q参数(查询条件指定参数)和ob参数(排序参数)进行分析,确定所请求的对象需要查寻哪些条件,将分析结果转换成sphinx可以识别的查寻条件,向索引服务器Node Indexer Server发送查寻请求,索引服务器跟据查寻条件,在索引中进行查寻,索引服务器将查寻后的对象ID(例如前述的文档ID)返回给API应用服务器。
2.API应用服务器得到对象ID(文档ID)后,通过分析http请求中的fd参数(返回接口参数),确定需要返回哪些字段,然后利用刚刚得到的对象ID(文档ID)去MySQL数据库(在线数据库)进行查寻需要返回的数据(字段)。由于查寻mysql数据库时,永远都是使用对象ID(文档ID)查寻,而对象ID(文档ID)在mysql里都是主键,所以查寻效率极高。
3.MySQL在线数据库和离线数据库的内容是一一对应的,有一个在线数据库,就会有一个离线数据库,通过MySQL的主从同步复制功能,将在线数据库实时同步复制到离线数据库当中。要说明的是,在线数据库中包函写库,但本专利中不涉及此项内容,所以在线数据库和离线数据库可以简单镜像数据库,一模一样,只是使用他们的(人或其他服务器)不同。
4.正如上面所说,MySQL离线数据库是专门供索引创建服务器使用的,索引创建服务器上安装sphinx的indexer程序(创建sphinx索引的程序),indexer程序会跟据对应的配置文件,生成索引,而配置文件中,最重要的数据来源,就是指向的MySQL离线数据库。创建索引由crontab程序定时完成,如每小时生成一次索引。该服务器同时还安装了ftp服务,生成的索引以文件方式存放在ftp目录下以便Node Indexer Server可以将文件复制到本地。
5.Node Indexer Server上安装和sphinx的searhd服务(用于提供sphinx查寻的服务),通过crontab程序,定时执行查寻索引创建服务器上生成的索引文件并与本机索引文件进行比较的shell脚本程序,如果索引创建服务器上的索引文件比较新,则通过ftp方式将其下载到本机,完成下载后通知searhd程序使用新的索引文件。
在MySQL在线数据库和离线数据库中,跟据业务需求按群组划分数据库,如图1所示,按节目、视频、人物划分三个数据库群组,离线数据库和在线数据库是同步对应的关系,如,有一个在线视频库,就要有一个离线视频库,在线数据库是为线上实时提供实时数据的,而离线数据库是为了创建索引使用,由于创建索引时,数据库服务器负载非常高,为了不影响线上实时提供数据,所以才进行在线离线分离的。该结构理论可以支持所有的数据信息,任何信息都可以使用该结构以达到快速检索目的。
以视频目录服务为例:
1.视频目录服务确定需要呈现的数据,通过查寻表达式向中间层接口请求查寻;
2.接口接收到查寻请求后,将查寻表达式提交给语法分析器进行分析,解析成索引服务可接收的查寻命令,并提交给索引服务器。
3.索引服务器跟据查寻命令到索引中查寻符合条件的数据,并将找到的ID返回。
4.话语法分析器得到索引服务返回的ID到,直接到数据库中取出对应的数据,并按查寻表达式指定的返回字段和格式返回。
以下为应用层读取数据协议与示例(是指用于在数据库中进行检索的相应的参数,以及如何将这些参数拼装获取数据的符合URL规范的http地址,):
1、查询表达式定义
基本形式:q=field1:value1 field2:value2…
q为查询条件指定参数,filed指的是数据表中的字段,value指字段的值。后面的跟的数字代表不同的字段和字段的值。
每个字段和字段的值之间用“:”号分隔,构成了一个了最小查寻条件,多个最小查寻条件可进行组合,形成组合查寻条件,多个最小查寻条件中间用空格分隔。条件之间是和(AND)的关系。
其中,字段filed不指定时可以全文范围(指所有的文本类型的字段)内查寻。
举例:
q=showcategory:电影 releaseyear:2010
q=performer:孙红雷
q=越狱
q=showname:越狱
作为最简单的查询:
q=越狱(field1:value1只是基本形式,如果不指定会在所有的文本类型的字段中进行搜索)
表示在节目库中全文检索“越狱”,“越狱”称之为关键字(keyword)。
所有取数据的需求无非就是“找到想要的数据”,全文范围内查寻(全文检索)是一种模糊搜索的概念,找出来的数据不一定准确,所以才有了指定字段(即本文提到的field)的查寻方式,但模糊搜索在本中间层系统中仍然支持。
q=showname:越狱
表示在节目的名称(showname)里检索关键字“越狱”,showname称之为查询字段。
更进一步,可应用多个查寻字段:
q=showcategory:电视剧 releaseyear:2009
可找出2009年出品的电视剧。
字段值通常三种格式:
形式 |
格式 |
举例 |
说明 |
单值 |
value |
2008 |
|
多值 |
value1,value2,… |
2003,2008 |
2003年或2008年 |
范围 |
value1-value2 |
1930-1950 |
从1930年到1950 |
2、返回字段
基本形式:field1 field2…
接口参数:fd(fields)
说明:fd为返回接口参数,可根据需要,选择需要返回的字段。返回字段用参数fields,字段之间用空格隔开。例如:fd(field1field2)。
举例:
q=showcategory:电视剧 tv_genre:古装
fd=showname area avg_rating director tv_genre
上述会查询古装电视剧,并且返回电影的名称(showname)、评分(avg_rating)、地区(area)、导演(director)、类别(tv_genre)。
3、排序
基本形式:field1:[ASC|DESC] field2:[ASC|DESC]…
说明:指明结果集按某字段正序(ASC)或倒序(DESC)排列输出,可对字段进行排序,不是所有字段都支持排序。排序参数用ob。
举例:
q=showcategory:电视剧
fd=showname avg_vv
ob=avg_vv:desc
上述查询将返回电视剧的名称(showname)、节目集均播放数(avg_vv),并按节目集均播放数(avg_vv)倒排(desc),倒排是缺省。
q=showcategory:电视剧
fd=showname releaseyear
ob=releaseyear:asc
上述查询将返回电视剧的名称(showname)、出品年份(releaseyear),并按出品年份(releaseyear)正排序(asc)。
还可以多个字段排序,如下例:
q=showcategory:电视剧
fd=showname releaseyear showweek_vv
ob=releaseyear:desc showweek_vv:desc
4、面统计
有了查寻结果,有时候还需要知道这些结果在不同面上的统计,可使用面统计选项。面统计参数用facets或fc,各个面用空格隔开。
所谓的面统计,可理解为对一个字段下,多个值的统计。如showcategory(节目分类),是一个可枚举的类型,它的值可以有“电影”,“电视剧”,“综艺”。面统计就是统计一下“电影”有多少节目,“电视剧”有多少节目,“综艺”有多少节目。
q=showcategory:电视剧
fc=area releaseyear
通过上述查询,结果中将返回电视剧分类下,地区(area)和发行时间(releaseyear,亦称出品年份)这两个字段下值的统计,返回类似如下结构:
area
大陆(8782),
香港(2332),
韩国(454)
…
releaseyear
2008(532),
2006(433),
2009(223)
…
或者地区里面只统计大陆和香港:
q=showcategory:电视剧
fc=area:大陆,香港
5、其它参数
a)pn(page number)页号
b)pl(page length)每页记录数
通过查寻表达式查寻,满足条件的数据可能不会只有一条记录,大多数情况都会是一个列表,pl就是指一次返回数据的“条”数。而pn是要求返回“第几页”的数据。举列:通过一个查寻表达式查寻节目,满足条件的记录有200条,每页要求返回20条记录(pl=20),返回第2页(pn=2),那么得到的数据是这200条记录中,从第21条到40条的记录。
跟据以上参数,一个完整的中间层http请求,以节目资源为例,形如:
http://ds.youku.com/show?q=showcategory:电影 performer:李连杰&ob=releasedate:asc&fd=shownamereleasedate&pn=1&pg=10&fc=movie_genre
解析后,该请求包括以下参数:
showcategory:电影
performer:李连杰
ob=releasedate:asc
fd=showname releasedate
pn=1
pg=10
fc=movie genre
以上请求会返回“李连杰演过的所有电影的第1页的前10条记录(pn,pl参数),并按发行时间正序排列(ob参数),同时按电影的二级分类直接面统计(fc参数),要求返回字段为节目名称和该电影的发行时间(fd参数)”,得到的结果如下(以下表格只是为了阅读方便,实际程序当中返回的是json串形式)
筛选结果当前显示:1-10
pk_odshow |
showname |
releasedate |
29275 |
少林寺 |
1982-01-21 |
26806 |
少林小子 |
1984-01-26 |
44095 |
中华武术84版 |
1984-07-14 |
29153 |
南北少林 |
1986-03-01 |
30687 |
中华武术87版 |
1987-01-01 |
10380 |
东方巨龙 |
1988-01-01 |
10703 |
东方巨龙 |
1988-01-01 |
28283 |
少林海灯大师 |
1988-01-01 |
26545 |
龙行天下 |
1989-05-26 |
57422 |
黄飞鸿91版 |
1991-01-01 |
记录总数:63
面统计结果
movie_genre
动作:49
剧情:21
纪录片:12
冒险:10
惊悚:10
历史:7
犯罪:7
喜剧:6
奇幻:5
武侠:5
爱情:5
科幻:2
动画:1
恐怖:1
战争:1
西部:1
说明:
pk_odshow就是节目的ID,也是索引中所指的文档ID,所有资源的文档ID字段不需要fd参数指明,默认都会返回。
showname为节目名称,releasedate为该节目的发行日期(当然以上实例数据仅做为演示),这两个字段正是我们通过fd参数指定的字段。
由于我们指明了ob参数,要求以releasedata字段正序排列,所以返回的顺序都是以该字段正排。
记录总数63表示满足q=showcategory:电影 performer:李连杰这个条件的记录数有63条,而我们由于指定了pn=1和pg=10,所以返回这63条记录中的前10条。
按movie_genre(电影下的分类)进行面统计,统计出李连杰演过的电影中,动作片有多少(动作:49,即49部),剧情片有多少(剧情:21,即剧情片21部),值得注意的是,电影分类是可以多选的,如一部电影可以即是动作片,也可以同时是部剧情片,所以面统计的总数,一般不会等于记录总数。
具体的实施例
1、节目和视频筛选页
事例地址:http://www.youku.com/v_olist/c_97.html
以电视剧筛选页为例,其筛选条件有地区、类型、上映(时间)、排序等条件,用户可以点击任意条件,从不同唯独任意组合进行筛选喜欢的电视剧。
2、作为CMS系统数据源
目前网站大部分的频道页,都是由CMS系统完成,而里的呈现的数据,则由中间层提供,以电影频道页(http://movie.youku.com/)中的新片精选为例。
查询条件:
q=showcategory:电影 hasvideotype:正片 state:normalcopyright_status:authorized,public
返回结果:
fd=showid showname showsubtitle show_thumburlshowcategory deschead area streamtypes director performerreputation firstepisode_videourl
排序条件:
ob=showyesterday_search
结果数目:
pl=20
以上条件获取的数据内容为:
有正片(hasvideotype:正片)且版权状态为已授权和公共版权(copyright_status:authorized,public)的昨天搜索量最高的(ob=showyesterday_search)电影(showcategory:电影)状态正常(state:normal)前20条(pl=20)记录。
本发明所述方法可以进行多面筛选。
在优酷,用户筛选视频的需求是无法预测和多变的,很难给出某种固定的分类顺序来满足大多数用户的需求。通过多面筛选会引导用户筛选他最感兴趣的视频,用户在筛选的过程中筛选条件可以是动态的,通过添加新的筛选条件,进一步缩小筛选范围。有限维度条件可以搭配出无限多种筛选的可能。
比如:
“爱情片”?
“这两年最热的古装电视剧”?
“孙红雷演的电视剧”
“本周高清预告片”?
“80年代的中国老电影”?
同传统的目录型分层系统不同,多面分类法(facetedclassification)并不假定用户筛选视频的维度数量或顺序,维度都是同等对待。用户通常会从他最关心的维度开始筛选视频,并且往往是多种维度的组合。因此,上述问题被分解成以下维度的组合:
本发明所述的中间层系统为实现上述计算提供多面筛选接口和查询表达式,并且封装了实现方法,由于接口的相对稳定性,后端系统和前端系统可以分别独立的进行改进,从而方便整体系统的优化。
中间层经过优化设计,任意组合查询通常能得到极好的性能,前端不用关心性能问题。
有多个系统模块可以采用多面筛选服务,多面筛选API同各个系统的关系参见图3.
本说明书中未作详细描述的内容属于本领域专业技术人员公知的现有技术。