繁体   English   中英

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

[英]keyword relevance PHP MySQL Search Engine

我不知道为什么我在任何地方都找不到这个。 我认为这将是非常常见的要求。 我正在用PHP编写一个搜索引擎来搜索用户输入的关键字的For Sale列表的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";
    }

?>

输出的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

使用此代码,我从我的DB获得275个结果。 我的问题是它确实没有按行中找到的关键字数量排序。 它似乎通过id来排序结果。 如果我删除'GROUP BY id'然后它只返回1个结果而不是所有结果,这真的让我感到困扰!

我也试过转移到数据库中的FULLTEXT,但似乎无法做到这一点,所以我更喜欢坚持使用LIKE %Keyword%语法。

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

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

我建议如下:

  1. 为关键字创建单独的表。
  2. 创建一个您不想索引的非关键字列表(如常用英语介词等),以便不包含它们。 您可以在线找到它们的列表,随时可用。
  3. 添加新条目时,将字符串拆分为单独的关键字,省略步骤2中的关键字,并将它们插入到步骤3中创建的表中(如果尚未包含在其中)。
  4. 在单独的表中,使用指向关键字表的外键,将classifed_ad与关键字相关联。

如果您的classified_ad已被编辑,则必须再次执行步骤3和4(即,从关联表中删除的步骤4中插入的任何关键字以及再次分析的关键字并与分类广告重新关联)。

拥有此结构后,您所要做的就是搜索关联表并按匹配关键字的数量排序。 您甚至可以向其添加一个额外的列,并将该关键字的出现次数放在文章中,以便您也可以按顺序排序。

那会更快。

我曾经使用过一个名为Sphider的脚本,它做了类似的事情。 不确定它是否仍然被维护,但它在它解析的网页上以非常类似的方式工作。

我知道你说你有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')as Relevance FROM表WHERE MATCH('Content')AGAINST('+ keyword1 + keyword2'IN BOOLEAN MODE)HAVING Relevance> 0.2 ORDER BY Relevance DESC

请注意,您正在进行常规相关性查询以获取与使用BOOLEAN MODE的WHERE子句相关的相关因子。 BOOLEAN MODE为您提供满足BOOLEAN搜索要求的子集,相关性查询满足相关因子,HAVING子句(在本例中)确保文档与搜索相关(即得分低于0.2的文档)被认为是无关紧要的)。 这也允许您按相关性排序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM