改进我对MySQL数据库的PHP搜索?

时间:2013-09-26 14:50:08

标签: php mysql search

我正在建立一个网站,其中包含需要搜索的记录。我刚刚意识到搜索功能太精确了。这是一个食谱网站,例如,如果用户键入“keylime pie”,名为“Key Lime Pie”的食谱将不会显示在结果中。我不确定是否有我可以获得的脚本,但我真的很感激一些帮助。

这是我当前的查询:

SELECT * FROM `recipes` WHERE 
    `recipe_title` LIKE '%$search%' // Key Lime Pie
    OR `recipe_summary` LIKE '%$search%' // I love key lime pie
    OR `recipe_categories` LIKE '%$search%' //desserts, pies
//... etc

谢谢!

5 个答案:

答案 0 :(得分:2)

类似查询很快就会删除你的MySQL数据库。

如果它对你来说不是太复杂,使用Sphinx搜索mysql它会根据关键字密度和关键字权重等给你很好的结果。而且它真的非常快。

答案 1 :(得分:2)

您最好的选择可能是查看全文搜索。默认情况下,MySQL仅支持MyISAM中的全文搜索,但如果您运行的是MySQL 5.6或更高版本,则可以do it in InnoDB, at well

或者,您可以运行专用的全文搜索工具,例如LuceneSphinx。这些是更复杂的工具,包括相关性排名等,甚至可以处理拼写差异/错误(取决于工具)。

答案 2 :(得分:0)

不确定那些双引号,试试这个:

SELECT * FROM `recipes` WHERE (`recipe_title` LIKE '%$search%'
    OR `recipe_summary` LIKE '%$search%'
    OR `recipe_categories` LIKE '%$search%')

答案 3 :(得分:0)

我发现添加一个相关的表可以添加与特定条目相关的所有关键字。

因此,如果您的食谱名称是“Key Lime Pie”,您可以将其中一个关键字设为“KeyLime Pie”。这允许用户输入拼写错误或允许您添加人们可能寻找的明显相关术语。

这个非常简单的问题也可以通过在配方表中添加一个列来解决,在该表中存储名称(或其他短字段)而不包含空格(并且可能没有标点符号)。因此,例如名称“Key Lime Pie”也将存储为“KeyLimePie”。

现在您可以通过搜索名称“keylime pie”找到配方:首先从搜索词中删除空格(也可能是标点符号)。 “keylime pie”变成“keylimepie”。这样您的查询将返回“Key Lime Pie”条目。

您还可以通过在搜索字词的开头或结尾添加部分LIKE来扩展搜索范围。

假设您在名为recipe_title_no_space

的列中存储没有空格的标题
"SELECT * FROM recipes
WHERE
recipe_title_no_space LIKE '%".$search."'
OR
recipe_title_no_space LIKE '".$search."%'"

这样你就可以获得“keylime”和“pie keylime”的匹配。请注意,在某些情况下,这不会返回太多/不良结果。

答案 4 :(得分:0)

如上所述,有几种方法可以自定义搜索结果,但如果您想进行实验......

$searchArray = explode(' ', $search);
$idArray = array();

for($i=0; $i<count($searchArray) $i++) {
    $query = "SELECT * FROM table WHERE recipe_title LIKE '%$search%' 
    AND recipe_summary LIKE '%$search%' AND recipe_categories LIKE '%$search%'";
    $result = mysqli_query($link, $query);
    $row = mysqli_fetch_array($result);
    $idArray = array_merge($idArray, $row['id']);

}

$mostMatches = array_count_values($idArray);

foreach($mostMatches as $key => $value) {
    if($value > 1) {$popularResultId[] = $key;}
}

for($i=0; $i<count($popularResultId)$i++) {
    mysqli_data_seek($result, $popularResultId[$i]);
    $row = mysqli_fetch_array($result);
    echo "Title: {$row['recipe_title']}\n\r";
    echo "Summary: {$row['recipe_summary']}\r\n";
    echo "category: {$row['recipe_categories']}\r\n";
}

如果我的理论是正确的,您应该能够通过更改“if($ value&gt; 1)”向上或向下调整结果,甚至可以根据数据库的大小进行自动调整