【发布时间】:2012-09-19 11:26:54
【问题描述】:
我有以下问题
SELECT *
FROM `articles`
WHERE (
(
UCASE( `title` ) LIKE UCASE( '% Fishoil %' )
AND UCASE( `title` ) LIKE UCASE( '% for %' )
AND UCASE( `title` ) LIKE UCASE( '% more %' )
AND UCASE( `title` ) LIKE UCASE( '% musclemass %' )
)
OR (
UCASE( `text` ) LIKE UCASE( '% Fishoil %' )
AND UCASE( `text` ) LIKE UCASE( '% for %' )
AND UCASE( `text` ) LIKE UCASE( '% more %' )
AND UCASE( `text` ) LIKE UCASE( '% musclemass %' )
)
OR (
UCASE( `source` ) LIKE UCASE( '% Fishoil %' )
AND UCASE( `source` ) LIKE UCASE( '% for %' )
AND UCASE( `source` ) LIKE UCASE( '% more %' )
AND UCASE( `source` ) LIKE UCASE( '% musclemass %' )
)
OR (
UCASE( `unique` ) LIKE UCASE( '% Fishoil %' )
AND UCASE( `unique` ) LIKE UCASE( '% for %' )
AND UCASE( `unique` ) LIKE UCASE( '% more %' )
AND UCASE( `unique` ) LIKE UCASE( '% musclemass %' )
)
)
ORDER BY `year` DESC
我想做的,就是改变
UCASE( `tile` ) LIKE UCASE( '% Fishoil %' )
进入
UCASE( `title` ) LIKE UCASE( '%Fishoil %' )
OR
UCASE( `title` ) LIKE UCASE( '%Fishoil,%' )
OR
UCASE( `title` ) LIKE UCASE( '%Fishoil.%' )
OR
UCASE( `title` ) LIKE UCASE( '%Fishoil:%' )
OR
UCASE( `title` ) LIKE UCASE( '%Fishoil;%' )
OR
UCASE( `title` ) LIKE UCASE( '%Fishoil\'%' )
OR
UCASE( `title` ) LIKE UCASE( '%Fishoil"%' )
OR
UCASE( `title` ) LIKE UCASE( '%Fishoil!%' )
OR
UCASE( `title` ) LIKE UCASE( '%Fishoil?%' )
但在我看来,这使查询变得异常复杂,因为它必须进行多次匹配。是否有一种正则表达式可以一次性匹配“搜索词+特殊字符”?
如果是这样,最好的匹配方法是什么?
这是生成关键字搜索字符串的php代码
$specialchars = array(' ',',','.',':',';',mysql_real_escape_string("'"),'"','!','?');
foreach($seek as $searchword)
{
foreach($specialchars as $char)
{
$seeker[] = "LIKE UCASE( '%$searchword".$char."%' )";
}
$temp = implode(" OR ",$seeker);
echo $temp;
}
【问题讨论】:
-
您的查询没有那么复杂,只是非常slooooooooow:几乎可以保证会减慢查询速度的三件事:过度使用通配符 (
%):检查. WHERE 子句中有多个OR:检查。索引错误(可能检查) -
是的,它是一个搜索引擎,可以在数字图书馆中搜索 100 个单词的文本。尝试不使用通配符进行搜索。我可以使用建议来优化它。索引被照顾。我只需要一种更好的方法来进行查询,最好是正则表达式。