括一个或多个数据存储或数据库的任何合适的系统的一个或多个计算设备(例如,服务器)实现300的方法。该方法300可从步骤310开始。在【具体实施方式】中,在步骤310中,社交网络系统的一个或多个计算设备可以接收搜索查询。例如,接收的搜索查询可以包括用户通过社交网络系统承载的PHP(超文本预处理器)处理提交的结构化或基本非结构化的文本串。例如,所接收的搜索查询可以是“谁是John和Bob共同的朋友? ”、“谁在该照片中加标签? ”、“寻找San Carlos, CA附近有意思的地方”、“我的朋友中谁在该餐馆登记? ”、或者“谁喜欢该张贴? ”。
[0025]在【具体实施方式】中,在步骤320中,社交网络系统的一个或多个计算设备可以基于所接收的搜索查询确定一个或多个搜索词。在【具体实施方式】中,每个搜索词可以包括前缀和后缀。
[0026]例如,对于所接收的搜索查询“谁是John和Bob共同的朋友? ”,计算设备可以确定“John”的用户标识符〈177〉以及“Bob”的用户标识符〈213〉。计算设备可以确定所接收的搜索查询可由两个搜索词“朋友:〈177>”和“朋友:〈213>”组成。每一个确定的搜索词包括用户标识符(〈177〉或〈213?中的前缀“朋友:”(即,…的朋友)以及后缀。每个搜索词的预期搜索结果可以包括用户标识符的列表(例如,是用户〈177〉的朋友的用户的列表)。计算设备可以通过将与AND算子应用于两个确定的搜索词而确定所接收的搜索查询的结果:(AND朋友:<177>朋友:<213>)。
[0027]例如,计算设备可以确定所接收的搜索查询“谁在这张照片中加标签”可由具有“这张照片”的照片标识符〈65199〉中的前缀“tagged_in_ph0t0” (即,在照片中加标签的用户)和后缀的搜索词“tagged_in_ph0t0:〈65199>”组成。搜索词的预期结果可以包括与在照片〈65199〉中加标签的用户对应的用户标识符的列表。
[0028]例如,计算设备可以确定所接收的搜索查询“寻找San Carlos, CA附近有意思的地方”可由搜索词“placesjn:〈752039〉”组成,该搜索词具有前缀“placesjn”(地图瓦片(map tile)中的位置),以及与“San Carlos, CA”对应的地图瓦片标识符〈752039〉。在此,地图可以表示地理区域,诸如,世界、世界的一部分、或任何合适的区域。地图可被分成地图瓦片,其中,每个地图瓦片表示地图的特定地理区域。例如,与San Carlos, CA对应的地图瓦片〈752039〉可以包括具有地理坐标中的四角(37.52,-122.24)、(37.52,-122.30)、(37.47,-122.30)、以及(37.47,-122.24)的矩形区域。搜索词 “placesjn:〈752039〉” 的预期结果可以包括地点(或任何合适的概念)的标识符的列表,其中,每个地点(或概念)在地图瓦片〈752039〉的矩形区域内具有位置。
[0029]在【具体实施方式】中,在步骤330中,为每个搜索词,计算设备可以基于每个搜索词的前缀和后缀生成第一二进制数。计算设备可以基于前缀生成第二二进制数并且基于后缀的对象类型生成第三二进制数。计算设备可以通过连结第二二进制数和第三二进制数生成第一二进制数。
[0030]计算设备可以首先基于每个搜索词的前缀生成每个搜索词的第二二进制数。例如,计算设备可以将搜索词的前缀映射至具有10位的长度的第二二进制数。第二二进制数的10位的长度可以使第二二进制数表示高达大约1,000(21°)个不同的前缀,诸如,先前描述的“朋友:”、“tagged_in_ph0t0: ”以及“placesjn: ”。前缀的其他的实例可以包括“posts_of: ”(用户的张贴)、“commenters_of ”(关于张贴进行评论的用户)、以及“likers_of”(喜欢张贴、照片、或任何合适的概念的用户)。【具体实施方式】考虑搜索词的任何合适的前缀。计算设备可以访问存储在社交网络系统的数据存储中的映射表并且查寻表示特定前缀的特定10位的二进制数的映射表。
[0031]计算设备可以基于每个搜索词的后缀或每个搜索词的后缀对象类型生成每个搜索词的第三二进制数。计算设备可以基于每个搜索词的后缀的对象类型确定第三二进制数的长度。计算设备可以确定特定对象类型的第三二进制数的长度因此长度足够大以唯一表示存储在社交网络系统中的特定对象类型的所有合理的对象。第三二进制数的长度也可足够大到两倍以上以唯一表示特定对象类型的所有的合理对象以避免与散列函数相关联的冲突。在此,冲突可以表示提供给散列函数的两个不同的输入值(散列关键字)可能产生相同结果(散列值)。冲突不具有索引期望的一对一映射特性。例如,计算设备可以生成用户标识符的后缀的37位二进制数。S卩,用户标识符可以转换成37位的二进制数。37位二进制数足以唯一表示社交网络系统的215个不同的用户。对于另一实例,计算设备可以生成概念标识符(例如,地点的标识符)的后缀的64位二进制数。S卩,概念标识符可以转换成64位的二进制数。64位二进制数足以唯一表示社交网络系统的23°个不同的概念节点。对于又一实例,计算设备可以生成地图瓦片标识符的后缀的32位二进制数。S卩,地图瓦片标识符可以转换成32位的二进制数。32位二进制数足以唯一表示存储在社交网络系统中的地图的215个不同的地图瓦片。【具体实施方式】考虑了任何合适的后缀对象类型。例如但不限于,后缀对象类型可对应于用户、地点、概念、地图瓦片、张贴、照片、地点、应用程序、事件、网页、或视频。
[0032]在【具体实施方式】中,计算设备可以通过连结第二二进制数和第三二进制数生成第一二进制数。例如,搜索词“朋友:〈177>”的第一二进制数可以包括通过表示后缀〈177〉的37位(第三)二进制数连结的表示前缀“朋友:”的10位(第二)二进制数。因此,搜索词“朋友:〈177>”的第一二进制数具有47位的长度。对于另一实例,搜索词“tagged_in_photo:〈65199>”的第一二进制数可以包括通过表示后缀〈65199〉的64位(第三)二进制数连结的表示前缀“tagged_in_photo: ”的10位(第二 ) 二进制数。因此,搜索词“tagged_in_photo:〈65199〉”的第一二进制数具有74位的长度。对于又一实例,搜索词“places_in:〈752039>”的第一二进制数可以包括通过表示后缀〈752039〉的32位(第三)二进制数连结的表示前缀“placeS_in: ”的10位(第二)二进制数。因此,搜索词“placeS_in:〈752039〉”的第一二进制数具有42位的长度。
[0033]在【具体实施方式】中,在步骤340中,对于每个搜索词,计算设备可以通过散列第一二进制数从一个或多个数据存储访问和检索每个搜索词的一个或多个搜索结果。计算设备可以用合适的散列函数散列第一二进制数。即,数据存储可以用与散列函数相关联的一个或多个散列表为与每个搜索词对应的第一二进制数的搜索结果编索引。在一些实施方式中,在用合适的散列函数散列第一二进制数之前,计算设备可以将可逆变换功能应用到第一二进制数。在这种情况下,第一二进制数可具有“起伏”特性因为大多数“I”位在第一二进制数中的位的某个范围内。可逆变换功能可以将起伏的第一二进制数变换成更均匀分布的形式(例如,“I”位更均匀分布在第一二进制数的所有位中),因而避免与散列函数相关联的合理的冲突。在此,可逆函数F具有X = F-1(FOO)的行为,其中,F-1是F的倒数。
[0034]在【具体实施方式】中,数据存储可以保留多个散列表。每个散列表可以为特定后缀对象类型的搜索词的搜索结果编索引。即,数据存储可以基于搜索词的后缀的对象类型为搜索结果编索引。例如,数据存储可以保留具有用户对象类型的后缀的搜索词(例如,“朋友:〈177>”,其中,后缀〈177〉是用户标识符)的散列表。数据存储可以维护具有概念对象类型的后缀的搜索词(例如,“tagged_in_ph0t0:〈65199〉”,其中,〈65199〉是概念标识符)的另一散列表。数据存储可以维护具有地图瓦片对象类型的后缀的搜索词(例如,“placeS_in:〈752039>”,其中,〈752039〉是地图瓦片标识符)的又一散列表。此外,每个散列表可以包括可以为搜索词的前缀编索引的一个或多个前缀映射。在一个实施方式中,每一个数据存储可被配置为储存单个对象类型的对象。例如,数据存储可被配置为储存用户对象(和与每个存储的用户对象相关联的信息)。另一数据存储可被配置为储存概念对象(和与每个存储的概念对象相关联的信息)。第三数据存储可被配置为储存地图瓦片对象(和与每个存储的地图瓦片对象相关联的信息)。每一个数据存储可以包括上述一个或多个散列表。
[0035]与之相比,在没有基于上述每个搜索词的后缀对象类型使用不同长度的二进制数来表示搜索词的情况下,长的二进制数可以用于表示任意后缀(或缺少后缀)对象类型的任意搜索词。例如,96位的二进制数可用于唯一表示社交网络系统的任意搜索词。然而,用于为96位的二进制数表示的搜索词编索引的相应的单个散列表会比用于用先前描述的较短