kingso_module - Taocode

模块介绍

Merger

功能介绍

Merger的功能:

合并多台Searcher机器的部分查询结果,得到最终的完整查询结果

向Detail集群请求最终展示信息,并返回给用户

输入输出

Merger的输入是用户输入的url格式的查询请求串

例如:

 http://10.232.42.3:1133/bin/search?auction?q=mp3&ps=price&filter=&statistic

可以分为4部分:

检索条件

过滤条件

排序条件

统计条件

 

详细的介绍,请参考查询语法介绍

Merger的输出是检索到的文档展示信息,支持xml、protobuf、v3三种格式(可以在查询串中指定outfmt=xml、pb、v3)

处理流程

1、接收来自前端的查询请求query

2、将查询请求并发发送给searcher集群的一行(每列随机取一台机器组成一行),并收集来自searcher的返回

3、合并各个searcher返回的结果

4、向Detail集群的一行发送请求,获取显示信息

5、返回显示信息给前端

Searcher

功能介绍

Searcher的功能:

单台机器的检索、过滤、统计、排序

输入输出

*Searcher的输入是由Merger处理过的内部query

*Searcher的输出是经过检索、过滤、统计、排序后得到的结果信息

处理流程

1、主线程启动,读取配置文件,创建更新线程,载入索引库,创建线程池。打开服务端口,监听服务请求。如果收到检索请求,主线程将读取请求,将请求的sock句柄,内容,以及其他附加信息包装成一个session,然后通过线程池中取得一个查询线程,将session交给它处理。

2、更新线程打开一个服务端口,监听来自网络的更新数据,有数据到来就更新本地的索引库。查询线程读取session中的查询条件,执行查询过程,生成查询结果,然后返回给调用方

查询线程的工作流程

1、QueryParser的作用是把输入的查询条件建成一颗语法树。

2、检索过滤模块的作用是在索引库中找出满足语法树条件的所有doc list

3、统计模块在result doc list中进行指定的数据统计,主要是类目和属性的统计。

4、排序模块默认只提供最简单的HeapSort,可通过添加新的Sort Applicetion扩展功能

5、Context是上下文环境,提供计算所需的空间,中间结果,索引库指针等信息。

数据结构

倒排索引

一般来说倒排索引分为两级:

第一级,哈希表,关键词到二级索引【位置,长度,类型】的映射

第二级,二级索引,这是一块儿连续的存储,他的内部存有关键词所对应的id列表以及其他附属信息

二级索引的内部结构如下:

索引头:当前索引块得一些全局信息,以及下一个索引块的位置。一个关键词对应的二级索引可以分为多个索引块,通过索引头串联起来。

跳读表:相当于给后面的docid list做了一个B树,加速索引归并过程的docid查找。跳读表可以有很多种实现,跟索引压缩也非常相关。

Docid列表,关键词对应的docidlist,如图中的蓝色区域。ID就是document id, occ是关键词在文档title(或者其他字段)中的偏移量。用于精确匹配,相关性计算等场景。适用于文本很短的情况,occ不多。为了压缩空间和提高效率,将docid和occ存储在一起。

正排索引

这个profile的核心是“控制器”。他的执行流程如下:

1、控制器接收一条profile访问请求:包括docid,FieldName

2、通过访问字段描述表找到FieldName对应的字段描述和该字段所在的group,可以实现根据字段特性,访问规律将一些字段组合成一个group,提高cpu cache命中率

3、每个group内部是一个大数组,以docid为数组下标,再通过字段描述中的group内部偏移找到FieldName对应的值,返回。

Detail

功能介绍

Detail的功能

根据请求串中的Nid(文档的唯一标识)和lightkey参数,返回相应的显示信息并标红

输入输出

Detail的输入是由Merger发送的请求,形如 bin/search?_sid_=1,2,3…&_lightkey_=连衣裙,其中sid就是查询到文档的nid,_lightkey_是title高亮显示所用到的输入

Detail的输出是与输入nid相应的文档展示信息

处理流程

1、根据nid检索出value

2、对value进行一定的加工,输出。Value加工包括关键词高亮等处理

数据结构

Detail实际上是一个KV存储系统。Key是docid,也就是文档的nid;value是这个文档的所有展示信息,我们称之为一条记录。记录内部也有字段的概念。

Detail的存储结构分为两级,第一级是张哈希表,存储每个Nid到记录位置的映射关系;第二级是记录存储文件。每条记录的大小可以不相等。

因为DI只有添加操作,没有删除和修改操作。所以文件内部的记录可以连续存储。

Full build

功能介绍

根据输入的xml原始数据,生成查询中需要的检索文件,包括倒排索引、正排文件、detail数据

输入输出

Full build的输入就是xml格式的数据源文件 输入xml文件格式如下:

<doc>

title=男士长款拉链钱包

nid=498765419

...........................

...........................

</doc>

每个字段以0x01结尾

Full build的输出就是索引库(正排,倒排),Detail库

处理流程

读取xml文件中的每条记录,根据配置文件生成三类文件:

一组倒排数据源文件,格式为:

docid,text field

docid,text field

一个正排数据源文件,格式为:

Docid filed1 field2 field3 … filedN

Docid filed1 field2 field3 … filedN

一个detail数据源文件,格式与正排相同,但内容不同

其中docid都是从0,1,2,3自然数增长。不同文件的docid需要统一生成。

Update(增量更新)

功能介绍

根据输入的增量xml数据,修改检索文件(倒排索引、正排文件、detail数据),实现对检索库的动态更新

输入输出

*Update输入:增量的xml数据文件,格式与总量数据相同。

*Update输出:searcher和di内部的索引结构得到更新。

处理流程

一条消息的更新执行过程入下:

1、feed接口将增量消息传送给dispatcher

2、dispatcher根据NID(文档的唯一标识)的hash值转交给某一个builder处理。

3、builder主线程解析这条消息,做归一化,编码,分词等操作。然后将消息push到文件队列。

4、builder发送线程读取文件队列内容,发起对某列所有detail进程的更新。一个线程对应一个detail,builder发送线程读取文件队列内容,发起对某列所有searcher进程的更新。一个线程对应一个Searcher。

Sort

功能介绍

根据查询串中指定的字段或配置文件中配置的排序字段,对检索过滤后结果进行排序,并生成排序结果

输入输出

*输入:检索过滤的输出结果

typedef struct SearchResult

{

uint32_t *nDocIds; /* docid结果数组 */

uint32_t *nRank; /* rank分数数组 */

uint32_t nDocSize; /* search到的doc数组大小 */

uint32_t nDocFound; /* search到的有效doc数 */

uint32_t nEstimateDocFound; /* 索引截断预估有效doc数 */

uint32_t nDocSearch; /* search的doc总量 */

} SearchResult;

*输出:排序结果及传送给上游节点的排序相关数据

处理流程

1、根据配置文件进行初始化,生成排序对象,如HeapSort

2、解析查询query,依次与每个排序对象的condition进行比较,如果匹配,则把该排序对象插入排序链条中

3、生成排序资源类SDM,主要用于存储排序依赖的字段值和排序结果

4、依次执行排序链条中的排序方法(process),对排序资源类SDM进行处理

5、把排序后的SDM解析为输出结果(ClusterResult),传给上游节点

kingso_module - Taocode的更多相关文章

  1. kingso_sort - Taocode

    kingso_sort - Taocode 如何编写新sort 由于排序逻辑多种多样,kingso的排序设计成是由一个个排序对象串起的排序链条组成.排序对象之间可以任意组合(只需要改配置文件),就可以 ...

  2. kingso - / - Taocode

    kingso - / - Taocode     这两天在线下搭建了kingso示例服务,有兴趣的同学请自取. 源代码位置:192.168.201.73:9022 /home/wcm/kingso 安 ...

  3. 使用Myeclipse + SVN + TaoCode 免费实现项目版本控制的详细教程

    通过Myeclipse + SVN插件 + TaoCOde可以省去代码仓库的租建:同时还可以很好的满足小团队之间敏捷开发的需求.接下来详细介绍整个搭建流程. 首先,介绍所用到的工具: 1,Myecli ...

  4. taocode

    http://code.taobao.org/project/lang/list/Go/1/

  5. eclipse安装svn进行版本控制

    1)通过help->installsoft->svn->add 填入http://subclipse.tigris.org/update_1.8.x 选择这两个,等其下载 2)配置一 ...

  6. 淘宝code—— 最给力的国内免费SVN(不限语言),异地团队开发、打造个人开源项目不再是梦

    相信大家都听说过GitHub,也有很多人在用,但是GitHub毕竟在国外,速度不是很给力,而且安装过程也是很漫长.今天来给大家介绍一个国内的免费的开源项目平台,当然也是一个SVN版本控制器,名字叫ta ...

  7. GitHub & Bitbucket & GitLab & Coding 的对比分析

    目前基于 Git 做版本控制的代码托管平台有很多种,比较流行的服务有 Github.Bitbucket. GitLab. Coding,他们各自有什么特点,个人使用者和开发团队又该如何选择? 在这篇文 ...

  8. 关于TbSchedule任务调度管理框架的整合部署

    一.前言 任务调度管理作为基础架构通常会出现于我们的业务系统中,目的是让各种任务能够按计划有序执行.比如定时给用户发送邮件.将数据表中的数据同步到另一个数据表都是一个任务,这些相对耗时的操作通过任务调 ...

  9. 笔者带你剖析淘宝TDDL(TAOBAO DISTRIBUTE DATA LAYER)

    注:本文部分内容引用本人博客http://gao-xianglong.iteye.com/blog/1973591   前言 在开始讲解淘宝的TDDL(Taobao Distribute Data L ...

随机推荐

  1. 射频识别技术漫谈(18)——Mifare Desfire

    Mifare  DESFire(MF3 IC D40/D41,本文以D40为例)遵守14443 TypeA协议,卡内的数据以文件形式存储,所以有人认为它是准CPU卡,主要用于安全性要求较高的非接触式领 ...

  2. js动态加载控件jsp页面

    例子1:(具体参照drp中的flow_card_add.jsp)<script>    var rowIndex = 0;     function addOneLineOnClick() ...

  3. HDU1181【有向图的传递闭包】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1181 题意很简单. 有用并查集做的.我这里用传递闭包做. 有向图的传递闭包采用Floyd思想,可以判断 ...

  4. Warning: Unable to send packet: Error with PF_PACKET send() [11]: Message too long (errno = 90)

    今天在使用tcpreplay重放流量时,发现有的数据包没有发送成功: Warning: Unable to send packet: Error with PF_PACKET send() [215] ...

  5. Linux通过网卡驱动程序和版本号的信息

    检查卡制造商和信号 查看基本信息:lspci 查看详情:lspci -vvv   # 3小作文v 查看卡信息:lspci | grep Ethernet 查看网卡驱动 查看网卡驱动信息:lspci - ...

  6. 道路软件质量:SourceMonitor

    有些事情必须这样做,不是幸福,但是,缓解疼痛,因为不.更痛苦--这是无奈. 夏中义 <文心独白> 1 简介 博客没有更新了一段时间,了阿里上市的成功之处:选择和坚持.事实上人生并没有绝对的 ...

  7. junit学习笔记(二):hamcrest和TestSuit

    1. hamcrest hamcrest可以有效增加junit的测试能力,用一些对通俗语言来进行测试. Hamcrest 是一个测试的框架,它提供了一套通用的匹配符 Matcher,灵活使用这些匹配符 ...

  8. Ext JS学习第五天 Ext_window组件(二)

    此文用来记录学习笔记 •上一讲我们已经学过了window的使用,那么在这将中,我们将结合然后把Ext中需要注意的地方,以及组建的使用给予介绍.indow做几个Web开发的经典示例. •ExtWeb实战 ...

  9. Vmware中Ubuntu挂ISO到虚拟光驱

    Ubuntu 下挂ISO到虚拟光驱的方法 https://i.cnblogs.com/EditPosts.aspx?opt=1 如果要ubuntu找到rpm软件包,需要把iso挂载到/media/cd ...

  10. web.xml 的加载顺序

    context-param -> listener -> filter -> servlet