还是搜索、索引的问题

搜索要弄清2个基本问题:

1)要搜索出什么类型的entity?

2)entity的哪个方面/维度和关键词发生关联的?一般来说可以有多个角度link到entity,一个entity支持多个索引,可以从不同的column检索


对于 web search,这两个问题都很简单,1)只有一种entity,就是网页,2)关键词和网页也只有一种关联关系,就是包含关系


对于linkedin或者facebook的typeahead搜索,返回的就是多种entity,有people,event,company,把关键词同时发送给不同entity对应的leaf search service,然后aggregate结果。这里也没有指定dimension,也就是就支持一种关联,没有dimension,其实是一种or的关系,entity的任意一个字段和关键词有关联,entity就和这个关键词有关联。实现起来就是类似一般doc建倒排的过程,过一遍entity(的每个字段),遇到一个word,就给这个work和entity之间建立一个link,等于是把各个字段和合并了当成entity的flat content。之前德国juddi的那个项目做个类似的事情:把数据库表记录的字段合并,送到lucene做full text index。


但是更一般,的比如MDS,是应该支持entity的多维度搜索的,以追求更精确、结果更少的搜索,比如,我就想搜title里包含关键词的,description包含的不算。

对于支持多entity type,每种entity又支持多种dimension的search 系统,索引怎么组织?

对于数据库,索引是应该是per table per column的,也就是一个table的一个column对应一个索引,独立的一棵树。

对于search 系统,有多种选择:

1)现有系统一般是先per entity type的,因为要按entity type做 垂直partition,每个entity type对应一个leaf search service,可以在这个架构上继续支持多维度,两个选择:

a)每个维度一颗索引树,到对应维度的索引去搜

b)所有维度共享一棵搜索树,只是value部分是多条拉链:{ key : { dimension1 : [1, 3, 4], dimension2 : [2, 4, 6] } }

个人倾向于第二种方式,空间利用率更高一些

2)如果不是必须按entity type进行垂直partition,不同entity type的索引也可以共享:

{key, {entityType1 : {dimension1 : [1, 2],  dimension2:[3, 4]}, entityType2: {dimension1: [8, 9],  dimension2: [5, 6]} }


key,entityType,dimension 是搜索的三级,顺序可以任意组合,当然,entityType和 dimension的数量可以看作是常数,主要还是key的搜索。MDS的顺序是 dimension -> key -> entityType。

即便不支持显式的mult-dimension search,也就是entity和key之间只有一种关联,实现层面也可以用 key->entityType -> dimension 或者 entityType->key->dimension这种方式,只需返回entityType下所有的dimension拉链就行了,这样两种模式同时支持了。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值