Facebook 在他们的搜索中加入了一些独特的功能——甚至可能有些是专利的?我所说的功能是由三个不同的要求驱动的:
- 事实上,他们的数据库非常庞大,而且他们不能像您一样在需要的时候加入他们需要的数据,通常是在一个少于一百万条记录的单宿主业务应用程序中。
- 用户的期望受到其他搜索体验的影响,即谷歌,因此长尾搜索查询是通过将关键字附加到被搜索的人的名字来完成的,例如“佛罗里达州奥兰多”或“扶轮社”(或一些其他识别值,如雇主名称)。
- 数据架构似乎很浅,基于我们从应用程序中查看的窗口(当然它并不浅)。我要说的是,除了用户档案中所谓的“基本信息”(例如性别和当前城市)之外,使档案独一无二的许多因素并没有严格地分配给逻辑列。
因此,与数据集大小相关的需求存在复杂性,但需要向用户提供相关结果,向不精通搜索的用户社区提供他们的期望和培训谷歌。
鉴于所有这些(我的问题的改进):
a.) Facebook 需要哪些搜索功能,我们应该注意并在我们自己的搜索应用程序/引擎中部署这些功能?必要时,我的意思是由庞大的数据集驱动,或者由用户的期望驱动,以及网站有机增长和增加其数据之间的关系的需求——我的意思是用户。
b.)哪些搜索功能具有创新性并且值得数据和/或搜索架构师关注?
有些是显而易见的,例如对名字使用同义词——模糊匹配“Bill”查询与“William”记录。您可以在 Solr 中使用同义词列表来执行此操作。我认为这是必要的基本功能,当然不是创新的。
其他的创新值得我们关注。我可以提请注意的第一个创新示例是他们的搜索相关性是每个用户自定义的。如果我输入“John Smith”,我会得到与其他搜索者不同的结果集(理论上对我、我网络中的人、朋友的朋友等更匹配)。在您说这不是创新之前,因为您可以在 Google 中只键入“Pizza”,他们会通过将您的语言环境附加到查询中来为您提供相关结果,请继续。我希望对这个问题的回答和讨论,真的会在一些技术要求中形成框架,并提供一些想法,以将其作为搜索功能包括在内。
例如...
- 你猜他们会运行一个常规的批处理来对数据进行非规范化吗?(即做一个就地一级分离度、二级分离度等链接表的批处理作业)
- 从这样的批处理或非规范化中,它是否会限制命中数?这可以通过仅返回逻辑上最接近的“John Smith”匹配来证明。但是,非常用名称 [例如我自己的名字和姓氏] 的搜索似乎不受结果限制的影响,并且搜索将环顾世界,完全超出那些“几度”的分离。
- 他们是否按年龄增加相关性评分,为与搜索者接近同一年龄组的匹配提供更多相关性?(评论:似乎他们应该这样做,这可能至少是不应该发生的代际交流/会议的一个小减速——委婉地说,我知道)
从技术上讲,在后端,最好在数据库级别进行非规范化过程,然后索引“文档”?(澄清:对于那些联合到企业搜索的人来说,“文档”在概念上类似于数据库记录...... MOL)
或者,是否没有数据库非规范化。取而代之的是,编写搜索索引的过程包括将相关信息以及“网络内”或仅相隔几度的人写入每个“文档”中?
当然,有必要对此类信息进行预处理。在我自己没有在实践中做这件事的情况下,在我看来,在数据库级别批量非规范化是有利的,原因是搜索服务器擅长超快速地查找信息,但数据库服务器更擅长获取匹配数据(假设它扩展到不在搜索索引中的相关列)。
因此,扩展依赖于用户搜索者的搜索相关性的概念,请注意它也是用户最近浏览活动的派生。例如,搜索“John Smith Orlando”可能永远不会找到“正确的”John Smith,但在访问了正确的 John Smith 的 Facebook 页面后(假设您在电子邮件中获得了他的 URL),即使没有将 John Smith 添加为朋友,这一次,对 John Smith 的后续搜索实际上将在下一次返回该结果。[我想知道这要多久才能老化,或者它是否会老化?]
我在这里以 Facebook 为例,因为它们很大。它们的大小迫使一个经过深思熟虑的架构——比如什么保持正常形式,什么不能,因为你不能JOIN
重复一个 1 亿条记录表(从链接表的另一个“分支”重新加入同一个人表或者派生表可以产生“朋友的朋友”效果)。
相关性调整的实践几乎是一门艺术。数据集、业务规则和用户期望非常独特,以至于几乎不可能创建多用途评分模板,甚至是最佳实践。
话虽如此,通过查看那些在搜索方面做得足够好的大网站,有一种技术可以模仿,不是吗?
Facebook 采用了哪些技术?鉴于它们的规模,它们不能只在用户需要时通过 ORM 获取用户需要的东西(而不是对 ORM 冠军的猛烈抨击)——这需要精心策划的规范化、SQL 级索引、去规范化和搜索服务器索引。
谁能建议那里有哪些技术?就此而言,任何具有类似搜索(和大型数据集)的大型网站也将提供良好的主题建议。