【问题标题】:Creating a Facebook like search within my website [closed]在我的网站中创建类似 Facebook 的搜索 [关闭]
【发布时间】:2017-02-10 10:16:25
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 您的问题对于 SO 来说有点过于宽泛,因为您实际上并没有准确的问题陈述(例如哪些代码不起作用)。但是,您要查找的内容称为实时搜索——那里有大量的 JS 库以及教程,可以帮助您实现基于文本输入的实时搜索。实时搜索需要考虑很多事情,例如数据库设计以及如何查询表等等。
  • 如果你对 Graph 数据库感兴趣,你可能想用 Neo4j 进行统计,我相信它已经融入了一些自然语言处理。尽管同意 @Terry。这不适合 SO。
  • 好的,谢谢你的信息:)

标签: php mysql database graph-databases relevance


【解决方案1】:

您可以分别解决每个示例,但这可能会很乏味,而且您可能会在性能方面陷​​入困境。

来自伦敦 (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 样式的图形搜索相关性来处理您所描述的内容。就您而言,听起来您可能想要个性化搜索,例如搜索者几度分离内的所有相关顶点(使用您拥有的任何边缘关系:位置、兴趣、朋友等...)。


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

【讨论】:

  • 听起来不错@Peter,谢谢。您认为关键字是如何定义的,换句话说,我怎么知道应该针对主题查询自行车,针对位置查询伦敦。是否有一种算法可以将关键字与数据库中的实体关联起来,还是只是反复试验的问题?
  • 您可以尝试通过图形距离(在搜索者和具有匹配关键字的节点之间)做一些通用的事情。但最终,您可能希望围绕特定实体类型自定义逻辑。
  • 能否请您多解释一下您的评论,以便更清楚地说明您的想法,也许可以举个小例子?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-10
  • 2017-04-03
  • 2014-03-25
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 2011-01-29
相关资源
最近更新 更多