还是搜索、索引的问题
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拉链就行了,这样两种模式同时支持了。
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拉链就行了,这样两种模式同时支持了。
相关文章推荐
- 高考之外
- POI操作Excel表格系列5 --- 遇到的问题
- Swift 2.构造函数-子类构造
- C++与C的保留小数
- Effective C++(条款26-31)
- UIButton
- [置顶] Android性能优化笔记
- 汇编复习————指令集
- CPU寄存器操作方式
- jsp中使用out和response.getOutputStream的方法
- 电脑爱好者GHOSTXPSP3网吧专用版V1.0
- Swift之小项目实战
- Android-ListView卡顿优化
- MapReduce算法设计-计算单词共现矩阵
- 荐书一本-----《天才在左,疯子在右》
- [ExtJS5学习笔记]第十五节 Extjs5表格显示不友好?panel的frame属性在作怪
- 如何将自定义标签封装成一个Jar包
- Ubuntu下使用Vi是方向键变乱码 退格键不能使用的解决方法
- QT 编写xml文件实例
- LeetCode-43-Multiply Strings(模拟)-Medium