IN() 在这里派上用场。有几种方法,它们的复杂性和性能各不相同
我假设您有一个类别表,并且无论使用该类别的任何内容都通过类别标识符使用它,如下所示:
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
您的索引器可以随心所欲地确定排序或相关性。困难的部分是确定何时为您的内容编制索引。