zoukankan      html  css  js  c++  java
  • KINGSO介绍

    kingso_intro - Taocode

    KINGSO介绍

    KINGSO是一种高效的垂直化的搜索引擎,其包含query解析、检索、过滤、统计、排序功能,不包含抓取部分。它对商品搜索做了针对性的优化,目前在淘宝的多个应用中使用。

    系统架构

    如下是KINGSO的整体架构图:





    *蓝色的部分负责查询功能

    *黄色的部分负责建库功能

    *绿色的部分负责更新功能

    *红色的部分负责集群管理、负载均衡、容错

    查询流程

    1、前端将查询请求以URL的形式发送给Merger Server

    2、Merger Server对查询请求进行一定的转换改写之后(例如分词等),发送给多个Searcher

    3、收到请求的Searcher进行检索、过滤、统计、排序后,将结果返回给merger

    4、merger汇总各个Searcher返回的结果,进行一系列处理后(归并排序),生成获取展示信息的请求

    5、将请求发送给给Detail集群

    6、Detail经过一定的处理(主要是取字段和高亮显示),把显示所需信息返回给Merger

    7、Merger合并最终的展示信息返回给前端

    全量建库

    全量建库是指在离线状态下,解析原始数据(xml格式),生成在线查询中所需要的索引文件及信息文件

    全量建库流程如下:

    1、读取并解析原始数据文件(xml格式)

    2、根据配置文件,分别处理不同字段,生成倒排、正排、信息数据中间文件

    3、根据各种中间文件,建立最终的倒排索引、正排索引、信息

    增量更新

    增量更新是指在线状态下,接收并解析更新数据(xml格式),根据更新数据修改索引文件及信息文件

    增量更新流程如下:

    1、将增量消息通过网络传送给dispatcher

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

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

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

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

    集群管理

    KINGSO的集群管理模块是使用clustermap,它的主要功能是:管理merger集群、search集群和detail集群,能够检测到集群节点的上下线,负载情况,使整个集群能够高容错、高效率的提供查询服务

    clustermap与各个服务(merger、searcher、detail)是通过四种报文进行交互的:

    *注册报文:

    每个服务节点都需要先发送注册报文给clustermap,告知自身的存在

    *心跳报文

    每个服务节点通过发送心跳报文给clustermap,报告健康状态

    *订阅报文

    只有merger等上游节点,才需要使用订阅报文,来向clustermap订阅其下游节点的状态信息

    *通知报文

    由clustermap发送给订阅的服务节点,通知其下游节点的状态变更

    服务框架

    KINGSO的各种服务角色(merger、searcher、detail)都是使用同一种服务框架framework

    该框架使用了异步通信模式,并通过剥离业务逻辑,使之具有良好的通用性

    framework架构图如下:





    服务流程:

    1、用户发出查询请求

    2、Service(anet回调类)处理查询请求,并根据请求内容生成session对象,放入任务队列taskQueue中

    3、Dispatcher从任务队列中获取session,生成相应的Worker对象,调度给线程池中的线程去执行Worker

    4、Worker进行应用逻辑相关的处理,返回应答信息给anet

    5、Anet负责把应答信息返回给用户

    单机模式

    有些应用场景,索引数据量不大,负载压力较低,一台服务器即可支持

    KINGSO针对这种情况,提供了单机模式,即一个searcher服务即可完成整个查询流程

    单机模式:





    查询流程:

    用户发出查询请求

    1、Service(anet回调类)处理查询请求,并根据请求内容生成session对象,放入任务队列taskQueue中

    2、Dispatcher从任务队列中获取session,生成相应的Worker对象,调度给线程池中的线程去执行Worker

    3、Worker调用QueryParser模块,解析查询请求

    4、Worker调用Search/Filter模块,对索引数据进行检索、过滤

    5、Worker调用Statistic模块,对检索后的结果进行统计

    6、Worker调用Sort模块,对检索后的结果进行算分、排序

    7、Worker调用detail模块,获取目标文档信息

    8、Worker对待展示信息进行格式化(目前支持xml及protobuf格式)

    9、Anet负责把最终展示信息返回给用户

    附件


    taiyi

    |
    2013-07-04 15:14:12
    |

    framework.jpg

    |

    35.5 KB

    taiyi

    |
    2013-07-04 15:13:58
    |

    single.jpg

    |

    37.8 KB

    taiyi

    |
    2013-07-04 15:12:45
    |

    architecture.jpg

    |

    32.5 KB

    taiyi

    |
    2012-08-23 11:20:05
    |

    架构图.jpg

    |

    32.5 KB

    taiyi

    |
    2012-08-23 11:20:05
    |

    服务框架.jpg

    |

    35.5 KB

    taiyi

    |
    2012-08-23 11:20:05
    |

    单机模式.jpg

    |

    37.8 KB
  • 相关阅读:
    Power BI for Office 365(八)共享查询
    Power BI for Office 365(七) Power BI站点
    Power BI for Office 365(六)Power Map简介
    Power BI for Office 365(五)Power View第二部分
    Power BI for Office 365(四)Power View第一部分
    Power BI for Office 365(三)Power Pivot
    Power BI for Office 365(二)Power Query
    java 继承、重载、重写与多态
    Android 热修复方案Tinker(一) Application改造
    阿里最新热修复Sophix与QQ超级补丁和Tinker的实现与总结
  • 原文地址:https://www.cnblogs.com/lexus/p/3542910.html
Copyright © 2011-2022 走看看