我有一个基于jQuery的自动完成搜索功能的网站,效果很好。
目前虽然我只有一个搜索框适用于所有类别,但我想要的是有人能够输入,例如,dorian gray dvd
(以任何顺序)将搜索{{1}在dorian gray
类别中。这将需要在服务器端有点神奇,以确定是否任何单词是类别关键字,然后限制搜索。
在PHP / MySQL中执行此操作的最佳(最快)方法是什么?
我目前有一些思路
有什么建议吗?
答案 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%”,因为它确实会影响性能。
$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
您的索引器可以随心所欲地确定排序或相关性。困难的部分是弄清楚何时索引你的内容。