电子商务网站-全文检索系统总体介绍

来源:互联网 发布:java基础教学免费视频 编辑:程序博客网 时间:2024/05/17 04:46

有很久没有更新了,过去的一年,升级TSE4.0系统把大家累坏了,最近给新员工准备了一个培训ppt,贴在这里吧。csdn的图片上传越改越糟糕,连续传2张图片就不行了,新图片不能和删除的图片同名,估计是删除数据延迟的问题,体验不爽。好多图片都传不上去

全文检索的一些概念

       文档:搜索引擎最小信息检索单元。对于网页搜索一条文档理解为一个网页,对paipai网搜索,一条文档表示一个完整的商品信息

       倒排索引:关键词到文档编号的映射。

{pair<KeyWord,docid1,docid2…..>}

       索引切换:将索引服务器中生成好的索引数据拷贝到搜索服务器

 

全文检索系统总体架构

 

 

 

       Web: 使用TWS服务器,接受用户请求,处理业务逻辑,渲染页面,80%以上的产品需求集中在这里

       Commserver:协议分发服务器,将不同的请求发送到不同的后台

       CacheServer:缓存服务器,协议级Cache,支持即时删除,LRU淘汰,有70%左右的命中率

       UnionServer:聚合服务器,将分布式搜索系统返回的检索结果合并

       SearchKernel:检索服务器,负责处理搜索请求

       DocServer:文档服务器,负责存储具体的文档信息,返回完整的文档信息给用户

       IndexServer:索引服务器,负责生成索引

       TransferServer:中转服务器,负责综合排序,将商城数据格式化为搜索的标准数据格式

 

 

全文检索的处理流程

       用户发送搜索请求,Web层对用户的输入条件进行过滤,进行同义词、直达…处理,将处理后的请求发送到commserver

       Commserver根据Appid对请求分发到Cache或者其他后台,负载均衡

       Cache收到请求后判断是否命中,命中则返回,不命中则转发给UnionServer,同时cache存储返回结果

       UnionServer收到请求后,负载均衡,分发给各个SearchKernel并行检索

       SearchKernel检索后,返回排好序的DocId集合

       Union对各个后台返回的Docid集合进行合并

       Union把合并后的结果集发送到DocSvr,获取完整文档信息,返回给CacheSvr

SearchKernel的处理流程一

       SearchKernel收到用户请求,解析出查询串

       针对查询串进行分析,生成语法树

       对语法树每个节点,进行分词查询倒排索引

       对查询出的多个倒排索引按照语法关系,进行逻辑运算

       按照DocId进行其他查询条件的过滤

       对DocId进行排序

       将DocId返回给UnionSvr

SearchKernel的处理流程二

 

 

 

索引的格式一

 

       Tis文件:

       <TermCnt,TermInfos>

       TermInfos-><termInfo>……

       termInfo-><Term,DocFreq,.frq文件偏移,.prx文件偏移>

       Term-><PrefixLen,Suffrix,FieldNum>

       PrefixLen->前缀的长度,例如:china,chinese,Prefix为”chin”,PrefixLen=4,suffix=“ese”

  PS:Term表示一个短语(索引分词的最小粒度)

       Freq文件:

表示一个Term在文档中出现的次数

<TermFreqs>TermCount

TermFreqs-><TermFreq>

TermFreq->DocID,Freq?

DocID/2表示文档编号的偏移(相对于前一个文档),如果DocID为奇数,表示Term在文档只出现过一次,为偶数是,Freq表示了出现多少次。

例如:一个词在文档3中出现1次,在文档9中出现了8次,则TermFreqs中出现如下序列:

TermFreqs=<7,18,8>

 

索引的格式二

       prx文件:

       表示一个Term在文档中出现的位置,和frq文件配合使用

        <TermPositions>

         TermPositions-><Postions>

         Positions-><pos>

         Posà位置序列,从小到大排序

       例如:某个term在文档1的位置3,5出现,在文档2的位置4,9出现,Positions的序列如下:

       <3,2,4,5>

       tii文件:

Tis文件的索引信息,方便快速查找tis文件中某个域信息

       Fdx文件:

Fdt文件的索引

<fieldpostions>

Feildpostionsà某个文档在fdt中的位置信息,定长,可以随机访问

       Fdt文件:

       存储具体的域信息

       <fieldcount,<fieldnum,Bits,Value>>

 

索引的存储方法

       差分存储

       {1,4,7,9}存储为{1,3,3,2}

 

       VInt压缩

       每字节的高位表示是否还有剩余字节

       低七位表示数值

0~127使用一个字节表示

128:00000001 10000000

 

分布式索引

       为什么需要分布式

       减低数据压力,便于并行处理

       如何分布

数据切分方式

       如何扩容

针对部分节点扩容,不需要每次都用翻倍的方式扩容

 

 

增量索引

       数据量不断增大,索引文件变大

 

       增量切换的时间增长,切换的风险增加

 

       增量索引和全量索引的合并

 

       实时搜索引擎

搜索的准确性

       案例一

       商品A:上海鲜花速递

       商品B:青岛海鲜特价供应

用户输入“海鲜”,商品A,B同时命中如何解决排序问题?

 

       案例二

       用户搜索“诺基亚”出现很多“诺基亚”的耳机

       用户搜索“N72”,会出现很多赠送“N72耳机“的商品

关键词类目优先

       针对主产品和附属产品设置不同的权重

       Nokia手机的权重大于Nokia耳机的权重

 

       对于一些无法区分主产品和附属产品的,通过配置来解决

       如何做到自动化,不需要人工配置?

       从用户的搜索日志统计,自动更新

关键词直达

       对于一些含义明确的关键词,不需要再进行全文检索

       搜索“N72”,直接到N72的类目

       缺点是什么?

       我们强制修改了用户的搜索条件,增加了类目过滤

       搜索的结果数变少

       类目优先可以解决上面的问题,但是增加了后台的复杂度,更新也相对比较困难。直达可以直接在前台处理。

模糊匹配

       用户输入长关键词时,容易出现搜索不到

       例如:”新款波司登羽绒服”,”诺基亚N72手机“

       问题根源:词位置信息的约束

       如果去掉词位置信息判断是否就可以解决这类问题?

       用户搜索“手机充电器”

       商品A包含”买诺基亚N72手机送充电器“

       比较完善的解决方案:设置权重多重排序

同音词、同义词

       同义词,主要用户扩大搜索结果范围

       搜索“婴儿“,标题中含有“宝宝”的也可以出来

       搜索“一”,标题中含有“1”的也可以出来

       同音词,主要用于纠错

       搜索“诺积压“,提示用户是否需要搜索”诺基亚“

       同音判断

       搜索”Marcbook”,提示用户是否需要搜索“MacBook”

       步长判断

Smartbox

 

       按照词被搜索频率的排序

       数据每天增量更新

       支持分词

       吞吐>1000个/秒

       拼音到汉字的映射(开发中)

       拼音缩写到汉字的映射(开发中)

未来的挑战

 

       准实时

       预排序

       程序级Cache

       聚类

       并行计算

       负载均衡

       丰富索引格式


原创粉丝点击