高级搜索功能

时间:2010-05-03 19:57:01

标签: php mysql search

我有一个基于jQuery的自动完成搜索功能的网站,效果很好。

目前虽然我只有一个搜索框适用于所有类别,但我想要的是有人能够输入,例如,dorian gray dvd(以任何顺序)将搜索{{1}在dorian gray类别中。这将需要在服务器端有点神奇,以确定是否任何单词是类别关键字,然后限制搜索。

在PHP / MySQL中执行此操作的最佳(最快)方法是什么?

我目前有一些思路

  • 搜索类别 匹配和可能订购的表 结果。
  • 或者将搜索字词拆分为 数组和单独搜索 匹配的类别。
  • 我刚才想到的另一个想法是 将类别标题连接到DVD 数据库中的标题和匹配 反对,或类似的东西...... 但这听起来很复杂 昂贵?

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

就循环和代码行而言,你的第一个想法可能是最快的。爆炸搜索查询,包装新数组的每个部分以对其进行格式化,以便您可以将其内爆并在mysql查询的末尾附加新字符串。

然后只需获取结果并将其附加到搜索查询中。为了节省空间格式,搜索查询与类别查询同时进行。

$temp=explode(" ", $string);
foreach($temp as $key=>$var) {
   $where[$key]=>"category='".mysql_real_escape_string($var)."'";
   $where2[$var]=>"field like '%".mysql_real_escape_string($var)."%'"; //formating the second query at the same time
}
$result=mysql_query("SELECT name FROM categories WHERE ".implode(" OR ", $where));
$cat=mysql_fetch_object($result)->name;
unset($where2['cat']); //removing the category from the search
$where2=implode(" OR ", $where2);
$result=mysql_query("SELECT * FROM table WHERE ($where2) and category='$cat'");

答案 1 :(得分:0)

IN()在这里派上用场了。有几种方法,它们的复杂性和性能各不相同 我假设您有一个Categories表,并且使用该类别的任何内容都使用类别标识符,如下所示:

categories
    id
    name

posts
    id
    category
    name

如您所述,此功能还会删除与类别匹配的关键字。它还允许您搜索多个类别。它会让您的搜索实现由您决定,但我不鼓励使用LIKE“%keyword%”,因为它确实会影响性能。

使用IN关键字

$keywords = $escaped_keywords = explode(' ', $user_input);
array_walk($escaped_keywords, 'db_escape');
$query = 'SELECT id, name FROM categories WHERE name IN ("' . implode('", "', $escaped_keywords) . ")";
$result = db_query($query);
$category_in = '';
while($row = db_fetch($result)) {
    $category_in .= ($category ? ', ' : '') . db_escape($row['id']);
    unset($keywords[$row['name']))
}
if($category_in) {
    // $where is your conditional from your current script
    $where .= ($where ? ' AND ' : '') . "category IN($category_in)";
}

改为构建搜索索引

另一种解决方案非常复杂,因为它需要制作搜索索引。搜索索引允许您在搜索索引的一部分中插入类别名称,并将其标记为与该关键字更相关(而不是在帖子正文中),并使该类别标记为比其他关键字更相关。这样做的好处是你可以对首先出现的内容进行各种控制:例如:

SELECT p.*, MAX(pi.relevance) relevance FROM posts LEFT JOIN post_index pi ON pi.post = post.id WHERE keyword IN (keyword_list) GROUP BY pi.post_date, pi.post ORDER BY relevance DESC

您的索引器可以随心所欲地确定排序或相关性。困难的部分是弄清楚何时索引你的内容。

相关问题