2011-12-20 159 views
0

假设我有5个文档作为行和2列'文档'和'描述'在mySQL表中。关键字搜索和排名结果

  • 资料1:约翰和南希是最好的朋友。
  • 资料2:约翰,凯西,大卫,南希是最好的朋友。
  • 文档3:Nancy和Casey是最好的朋友。
  • 文件4:David与Casey有关系。大卫和凯西疯狂地恋爱。
  • 文件5:大卫和约翰是兄弟姐妹。

因此,如果搜索查询是“David Casey”,那么如何根据所有5个文档中的词频计算查询并根据频率对结果进行排名。

在这种情况下,结果应该是这样的:

  • 文献4(因为有2 '大卫' 和2 '凯西')
  • 文献2(1 '大卫' 和1 '凯西')
  • 文献3(1'凯西)
  • 文件5(1 '大卫')

我读过许多TF-IDF的文章,但没有人能帮助我。我不知道如何编写代码。

这是我当前的代码:

$ searchCondition = “描述LIKE“%”。 implode(“%”或描述LIKE'%“,$ searchTerms)。 “%'”;

$ query =“SELECT description FROM table1 WHERE $ searchCondition ORDER BY description ASC”;

$ result = mysqli_query($ dbc,$ query);

...

...

...

+0

欢迎来到SO!另外,您的代码包含您应该修复的[SQL注入](http://php.net/manual/en/security.database.sql-injection.php)漏洞。 – 2011-12-20 10:35:09

+0

你有没有看过MySQL的全文搜索功能http://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html – liquorvicar 2011-12-20 10:43:42

+0

已经有了,但我仍然没有想法。 :/ – Fhzwn 2011-12-20 10:50:24

回答

0

这工作肯定:

$searchCondition = "description LIKE '%" . implode("%' OR description LIKE '%", $searchTerms) . "%'"; 
$orderCondition = array(); 
foreach ($searchTerms as $word) { 
    $orderCondition[] = "(length(description)-length(replace(description,\"".$word."\",\"\")))/length(\"".$word."\")"; 
} 
$orderConditionString = "(".implode(" + ", $orderCondition).")"; 

$query = "SELECT description FROM table1 WHERE $searchCondition ORDER BY $orderConditionString DESC"; 

从数据库中的项目进行排序,然后按降序。所以最相关的是获得第一名。

注意:只有当关键字的数量很小时才能正常工作。由于每个关键字的长度检查了3次。所以对更大的表格和更多关键字的响应时间会有点不同;)

+1

谢谢@AndVla,编码正在工作!但是,结果没有按照我在第一篇文章中提到的那样排列。你有什么主意吗? – Fhzwn 2011-12-20 11:47:20

+0

您想要在结果查询中获取数据库中每行的等级? – AndVla 2011-12-20 11:54:03

+1

是的,当我在你的php中实现你的代码时,结果是2,4,5,3。根据我的查询,结果应该是4,2,3,5:“David Casey”。我想知道如何处理这个问题。 – Fhzwn 2011-12-20 12:01:23