关键词相关性PHP MySQL搜索引擎

时间:2012-11-11 04:07:01

标签: php mysql search-engine

我不知道为什么我无法在任何地方找到这个。我认为这将是非常常见的要求。我正在用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%语法。

任何帮助表示赞赏!谢谢!

2 个答案:

答案 0 :(得分:2)

我建议采用完全不同的方法。您的方法繁琐,低效,对数据库很重,并且在您的数据库中添加越来越多的记录时可能会非常慢。

我建议如下:

  1. 为关键字创建单独的表格。
  2. 创建一个您不想索引的非关键字列表(如常用的英语介词等),以便不包括它们。您 可以在网上找到他们的清单,随时可用。
  3. 添加新条目时,将字符串拆分为单独的关键字,省略第2步中的关键字,然后将其插入 在步骤3中创建的表(如果尚未在其中)。
  4. 在一个单独的表中,使用指向关键字表的外键,将classifed_ad与关键字相关联。
  5. 如果您的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被认为是不相关的)。这也是   允许您按相关性进行排序。