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

Creating a Facebook like search within my website

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

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

我试图从与 PHP 类似的东西开始,但我无法确切地说出这可能是如何实现的。

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

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

您可以分别解决每个示例,但事实证明这可能很乏味,并且您可能 运行 在性能方面陷​​入困境。

People who like cycling and are from London (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

(using a really loose definition of 'liking cycling', and being 'from London')

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


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

Same query (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

These are also expressible as Gremlin traversals (for Titan and other Graph DBs), but they start getting quite verbose and hard to decipher.

有一些通用方法可以通过 facebook 样式的图形搜索相关性来处理您所描述的内容。就您而言,听起来您可能想要个性化搜索,例如搜索者几度分离范围内的所有相关顶点(使用您拥有的任何边关系:位置、兴趣、朋友等...)。


如果您不能轻松地列举出您今天想要构建的所有用例,您可能会更喜欢图形数据库,这样您就可以试验您的想法,并将它们投入生产,而无需削减出于性能原因的角落。