我不知道为什么我无法在任何地方找到这个。我认为这将是非常常见的要求。我正在用PHP编写一个搜索引擎来搜索用户输入的关键字的待售列表的MySQL数据库。
表格中有几列,但只需要搜索2列。它们被命名为file_Title& file_Desc。将其视为分类广告。项目标题和说明。
因此,例如用户将搜索“John Deere Lawn Tractor”。我想要发生的是那些将所有4个单词都显示在列表顶部的分类。然后结果只有3个等等。
我在http://www.roscripts.com/PHP_search_engine-119.html
上阅读了一个非常好的网页从作者示例中,我有以下代码:
<?php
$search = 'John Deere Lawn Tractors';
$keywords = split(' ', $search);
$sql = "SELECT DISTINCT COUNT(*) As relevance, id, file_Title, file_Desc FROM Listings WHERE (";
foreach ($keywords as $keyword) {
echo 'Keyword is ' . $keyword . '<br />';
$sql .= "(file_Title LIKE '%$keyword%' OR file_Desc LIKE '%$keyword%') OR ";
}
$sql=substr($sql,0,(strLen($sql)-3));//this will eat the last OR
$sql .= ") GROUP BY id ORDER BY relevance DESC";
echo 'SQL is ' . $sql;
$query = mysql_query($sql) or die(mysql_error());
$Count = mysql_num_rows($query);
if($Count != 0) {
echo '<br />' . $Count . ' RESULTS FOUND';
while ($row_sql = mysql_fetch_assoc($query)) {//echo out the results
echo '<h3>'.$row_sql['file_Title'].'</h3><br /><p>'.$row_sql['file_Desc'].'</p>';
}
} else {
echo "No results to display";
}
&GT;
输出的SQL字符串是:
SELECT DISTINCT COUNT(*) As relevance, id, file_Title, file_Desc FROM Listings
WHERE ((file_Title LIKE '%John%'
OR file_Desc LIKE '%John%')
OR (file_Title LIKE '%Deere%'
OR file_Desc LIKE '%Deere%')
OR (file_Title LIKE '%Lawn%'
OR file_Desc LIKE '%Lawn%')
OR (file_Title LIKE '%Tractors%'
OR file_Desc LIKE '%Tractors%') )
GROUP BY id
ORDER BY relevance DESC
使用此代码,我的数据库得到275个结果。我的问题是它确实没有按行中找到的关键字数量排序。它似乎通过id来排序结果。如果我删除'GROUP BY id'然后它只返回1个结果而不是所有结果,这真的让我感到困扰!
我也试过在数据库中转移到FULLTEXT,但似乎无法做到这一点,所以我更愿意坚持使用LIKE %Keyword%
语法。
任何帮助表示赞赏!谢谢!
答案 0 :(得分:2)
我建议采用完全不同的方法。您的方法繁琐,低效,对数据库很重,并且在您的数据库中添加越来越多的记录时可能会非常慢。
我建议如下:
如果您的classified_ad已被编辑,则必须再次执行步骤3和4(即,从关联表中删除的步骤4中插入的任何关键字以及再次分析的关键字并与分类广告重新关联)。
一旦你有了这个结构,你所要做的就是搜索关联表并按匹配关键字的数量排序。您甚至可以向其添加一个额外的列,并将该关键字的出现次数放在文章中,以便您也可以按顺序排序。
那会更快。
我使用了一个名为Sphider的脚本,它做了类似的事情。不确定它是否仍然被维护,但它在它解析的网页上以非常类似的方式工作。
答案 1 :(得分:0)
我知道你说你FULLTEXT
有问题,但我强烈建议你再回去试试。 FULLTEXT索引和搜索旨在完成您正在执行的操作,并且在WHERE子句中使用MATCH命令时, MySQL会自动将行从最高到最低相关性排序。
有关FULLTEXT的更多信息,请查看http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html
另外,请特别注意Patrick O'Lone在同一页面上发表的评论,其中一些内容在下面引用......
在文档中应该注意IN BOOLEAN MODE几乎总会返回一个 1.0的相关性。为了获得相关性 有意义的,你需要:
SELECT MATCH('Content')AGAINST('keyword1 keyword2')作为Relevance FROM表WHERE MATCH ('内容')反对('+ keyword1 + keyword2'IN 布尔模式)具有相关性&gt; 0.2订单 相关DESC
请注意,您正在进行常规相关性查询 获得与WHERE相结合的相关因素 使用BOOLEAN MODE的子句。布尔兰 MODE为您提供满足要求的子集 BOOLEAN搜索的要求,相关性 查询实现相关因子和HAVING 子句(在本例中)确保文档是 与搜索相关的(即得分的文件) 小于0.2被认为是不相关的)。这也是 允许您按相关性进行排序。