2

我正在建立一个网站,其中包含需要搜索的记录。我才意识到搜索功能太精确了。这是一个食谱网站,例如,如果用户输入“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

谢谢!

4

5 回答 5

2

您最好的选择可能是查看全文搜索。MySQL 默认只支持 MyISAM 中的全文搜索,但如果你运行的是 MySQL 5.6 或更高版本,你可以在 InnoDB 中进行

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

于 2013-09-26T15:01:12.173 回答
2

Like 查询很快就会关闭你的 MySQL 数据库。

如果对您来说不是太复杂,请使用Sphinx在 mysql 上进行搜索,它会根据关键字密度和关键字权重等为您提供不错的结果。而且速度非常快。

于 2013-09-26T14:54:56.070 回答
0

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

SELECT * FROM `recipes` WHERE (`recipe_title` LIKE '%$search%'
    OR `recipe_summary` LIKE '%$search%'
    OR `recipe_categories` LIKE '%$search%')
于 2013-09-26T14:54:31.727 回答
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 > 1)”来调整结果,如果您愿意,您甚至可以根据您的数据库的大小自动调整它。

于 2013-09-26T15:48:16.033 回答
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”的匹配项。请注意,在某些情况下,这不会返回太多/差的结果。

于 2013-09-26T15:07:23.180 回答