【问题标题】:How to make exact keyword search appear first?如何使精确的关键字搜索首先出现?
【发布时间】:2014-05-01 08:54:10
【问题描述】:

我制作了一个 mysql/php 搜索引擎,在其中添加了带有关键字 google 搜索引擎的 google url 和带有关键字 yahoo 搜索引擎的另一个 yahoo url。如果我在搜索框中输入 google search engine,如何让 google url 首先出现?

这是代码:

//connect to database
  mysql_connect("","","");
  mysql_select_db("");

   //explode out search term
   $search_exploded = explode(" ",$search);

   foreach($search_exploded as $search_each)
   {

        //construct query
    $x++;
    if ($x==1)
     $construct .= "Keywords LIKE '%$search_each%'";
    else
     $construct .= " OR Keywords LIKE '%$search_each%'";

   }

  //echo outconstruct
  $constructx = "SELECT * FROM searchengine WHERE $construct";

  $construct = "SELECT * FROM searchengine WHERE $construct LIMIT $s,$e";
  $run = mysql_query($constructx);

  $foundnum = mysql_num_rows($run);


  $run_two = mysql_query("$construct");

  if ($foundnum==0)
   echo "No results found for <b>$search</b>";
  else

【问题讨论】:

  • 我希望没有人愿意搜索任何带有撇号的东西。

标签: php mysql search-engine


【解决方案1】:

这里最好不要使用LIKE,而是使用Mysql 的FULLTEXT 索引。为此,您需要在要搜索的列上创建一个 FULLTEXT 索引。

ALTER TABLE 搜索引擎添加全文(关键字);

要查询,请执行以下操作:

SELECT * FROM searchengine WHERE MATCH (keywords) AGAINST ("$searchterm");

您可以组合不同的MATCH AGAINST 查询来满足所有关键字。此外,您可以将MATCH AGAINST 位放在查询的SELECT 子句中。这将返回一个分数,然后您可以使用该分数对结果进行排名。

此外,您还可以在运行查询之前进行一些词干提取工作。使用各种MATCH 运算符生成的分数,您可以将整个单词排名高于词干词。

【讨论】:

  • SELECT * FROM searchengine WHERE MATCH (keywords) AGAINST ("$searchterm");此代码无效。
【解决方案2】:
  1. 要查找条目数,您可以使用SELECT count(*) 代替完整查询的mysql_num_rows。
  2. 要对结果进行排序,您需要在查询中使用“ORDER BY”和一些字段,这些字段将作为排序条件。在你的情况下,你可以写
    $construct = "SELECT * FROM searchengine WHERE $construct ORDER BY Keywords LIMIT $s,$e ";

别忘了清理您的 $search。
$search = mysql_real_escape_string($search);

【讨论】:

  • 如果我将原始代码替换为 ( $construct = "SELECT * FROM searchengine WHERE $construct LIMIT $s,$e ORDER BY Keywords"; ) 我得到一个 ( Parse error: syntax error, unexpected /home/a5083847/public_html/search.php 中的 T_VARIABLE (第 52 行)php 错误
  • 这不只是根据关键字列将结果按字母顺序排列,而不是实际匹配的接近程度吗?
  • @Chris Henry,是的,按字母顺序排列。 actual match 只能用于全文搜索。我不知道他是否使用了 MyISAM 和其他列的名称,所以我建议使用通用变体。
猜你喜欢
  • 2018-02-21
  • 1970-01-01
  • 1970-01-01
  • 2012-01-05
  • 2011-11-05
  • 1970-01-01
  • 1970-01-01
  • 2016-03-12
  • 2015-01-27
相关资源
最近更新 更多