您的位置:首页 > 其它

还是搜索、索引的问题

2016-01-10 13:02 281 查看
搜索要弄清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拉链就行了,这样两种模式同时支持了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: