在我的网站中创建类似搜索的Facebook

时间:2016-10-02 08:22:08

标签: php mysql database graph-databases relevance

我们都知道在Facebook上存在图搜索。用户可以搜索喜欢骑自行车且来自伦敦的人,例如,喜欢瑜伽的朋友的朋友,或某个月或一年的朋友或男朋友的照片。

所有这些数据都是从没有过滤字段的单个搜索输入中提取的。

我试图从与PHP类似的东西开始,但我无法确切地知道如何实现它。

我想知道这是否仅通过某种数据库设计方法(简单的RDBMS)应用...或者它是一种图形节点结构,它通过关键字逻辑链接到数据库表......或者是RDBMS的混合体和NOSQL ......或任何其他方法。对于文本输入本身,必须对特定关键字进行某种剖析和匹配,以获得数据的相关性并将其指向正确的查询执行。

在我的网站中实现php图搜索(或至少类似的东西)的最佳做法是什么?我有类似于具有分组相关数据的零售电子商务系统?

1 个答案:

答案 0 :(得分:0)

您可以单独解决每个示例,但这可能会显得单调乏味,而且您可能会遇到性能问题。

  

喜欢骑自行车且来自伦敦(SQL)的人

   SELECT users.id 
     FROM users, posts, topics, locations 
    WHERE posts.topic_id = topics.id
      AND users.id = posts.author_id
      AND users.location_id = locations.id
      AND locations.city = 'London' 
      AND topics.name = 'cycling'    
 GROUP BY users.id   
 ORDER BY COUNT(posts.id) DESC
     

(使用非常宽松的'喜欢骑自行车'定义,并且'来自伦敦')

关系数据库不能特别优雅地处理大量连接。您的性能将受到负载或大型数据集的影响。

但是,在图形数据库(如Neo4J或TitanDB)中,您可以在一个针对服务优化的环境中以更通用的方式遍历相关实体的图形并收集匹配的实体节点您正在考虑的用例类型。

  

相同的查询(Cypher - Neo4J)

   MATCH (topic:Topics {name:'cycling'})
           <-[:POST_TOPIC]-(post:Posts)
           -[:AUTHORED_BY]->(user:Users)
   WHERE user-[:RESIDENT_OF]->(location:Location {city:'London'})
  RETURN user.id AS user_id, count(post) AS post_count
ORDER BY post_count DESC
     

这些也可以表达为Gremlin遍历(对于Titan和其他Graph DB),但它们开始变得非常冗长且难以破译。

通过Facebook风格的图形搜索相关性,可以通过一般方法来处理您所描述的内容。在您的情况下,听起来您可能想要个性化搜索,例如搜索者在几度分离内的所有相关顶点(使用你拥有的任何边缘关系:位置,兴趣,朋友等......)。

如果您无法轻易枚举您今天要构建的所有用例,您可能会对图形数据库感到满意,因此您可以试验您的想法,并将其投入生产中,而无需为表现原因。