2016-10-02 75 views
0

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

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

我想从类似于PHP的东西开始,但我无法确切知道如何实现。

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

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

+0

你的问题对于SO来说太宽泛了,因为你没有真正的问题陈述(比如哪个代码不工作)。然而,你要找的就是实时搜索 - 并且有很多JS库以及教程,可以帮助你基于文本输入实现实时搜索。实时搜索需要考虑很多事情,比如数据库设计以及如何查询表格等。 – Terry

+0

如果您对Graph数据库感兴趣,可能需要使用Neo4j进行统计,我相信,一些自然语言处理已经出炉。尽管与@Terry同意。这不适用于SO。 – JNevill

+0

好吧,伙计们,谢谢你的信息:) – KAD

回答

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),你可以遍历相关实体的图形和收集匹配实体节点在一个更通用的方法,在服务优化环境您正在考虑的用例类型。

相同的查询(暗号 - 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 

这些也表达为小鬼遍历(泰坦和其他图形DBS),但他们开始变得相当冗长,难以破译。

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


如果你不能轻易地列举你想建立今天的所有用例,你可能会用一个图形数据库快乐,这样你就可以用你的想法实验,并把它们发射到生产,而不必出于性能原因而偷工减料。

+0

听起来不错@彼得谢谢你。您如何看待关键字的定义,换句话说,我怎么知道骑自行车应该针对主题和伦敦的位置进行查询。是否有一种algortihm将关键字与数据库中的实体联系起来,还是仅仅是一个反复试验的问题? – KAD

+0

你可以尝试通过图表距离(在搜索者和具有匹配关键字的节点之间)做一些通用的事情。但最终,您可能想要定制围绕特定实体类型的逻辑。 –

+0

你能不能更好地解释你的评论,这样的想法更清楚,也许有一个小例子左右呢? – KAD