Php Mysql查询匹配多个可能的字符
我有以下疑问Php Mysql查询匹配多个可能的字符,php,mysql,search,sql-like,Php,Mysql,Search,Sql Like,我有以下疑问 SELECT * FROM `articles` WHERE ( ( UCASE( `title` ) LIKE UCASE( '% Fishoil %' ) AND UCASE( `title` ) LIKE UCASE( '% for %' ) AND UCASE( `title` ) LIKE UCASE( '% more %' ) AND UCASE( `title`
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 %' )
进入
但在我看来,这似乎使查询变得不必要的复杂,因为它必须进行多次匹配。是否有某种正则表达式匹配可以一次性与“searchterm+特殊字符”匹配
如果是这样的话,与之抗衡的最佳方式是什么
这是生成关键字搜索字符串的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;
}
我建议您使用,因为它们比通配符
等
语法强大得多。通过使用正则表达式,您可以将整个条件集放入一个REGEXP
调用中(每列)。使用下划线(
)代替为每个字符添加or子句。这就像一个通配符,除了一件事:它是单个字符的占位符:
SELECT * FROM foo WHERE bar LIKE 'visolie_';
匹配visolie!,visolie:,visolie?,和-因为like是不区分大小写的visolie!,也是
编辑:
出于所有的意图和目的:有许多优秀的搜索引擎是由非常聪明的人编写的,并且仍在由一群有能力的程序员进一步开发。尝试创建您自己的SE可能是一个很好的练习,但当它真正归结到它时,就使用它。他们已经为您完成了艰苦的工作,而作为一名开发人员意味着以一种聪明的方式懒惰。开放源代码软件以及网络的全部意义在于避免不断重复发明轮子的必要性
如果您绝对想构建自己的SE,PHP和MySQL是经过验证的技术,但可能不是这项工作的最佳工具。尝试寻找更快的DB(NoSQL?)替代方案(我想到MongoDB,只要你不经常更新数据,它的速度就快得惊人。再说一次:选择一个意味着失去另一个,你的数据存储就不那么安全……)
PHP相当快,但与C++相比,占用了大量资源。我不确定我是否做对了,但我准备赌一大笔钱说SE就像谷歌、雅虎!即使是破旧的Bing也有相当庞大的C(++)代码库。迄今为止,没有一种脚本语言能够超越这一点(而且我永远不会有一种脚本语言能够做到这一点)这可能值得一看 你可以这样做
SELECT *, MATCH(title,text,source,unique) AGAINST('fishoil for more musclemass') AS `score` FROM `articles` WHERE MATCH(title,text,source,unique) AGAINST('fishoil for more musclemass') ORDER BY `score` DESC, `year` DESC
whcih将首先返回最相关的结果
您还必须更改SQL表
ALTER TABLE articles ADD FULLTEXT(title,text,source,unique);
希望这有帮助您的查询没有那么复杂,只是非常缓慢:3件几乎可以保证会减慢查询速度的事情:过度使用通配符(
%
):检查。WHERE子句中有多个或:检查。糟糕的索引(可能是检查)是的,它是一个搜索引擎,在数字图书馆中搜索100个单词的文本。尝试不使用通配符进行搜索。不过,我可以利用一些建议来优化这一点。索引已处理完毕。我只需要一个更好的查询方法,预置正则表达式。这可能不会像预期的那样工作,因为“visolieW”也会匹配\uu
代表任何字符。我不想与所有字符匹配。这也会和维索林比赛,我不想要。@shedal说了什么。@Michaeldibets:是的,但这将匹配visoliecapsules
,而您当前所用的不会匹配。正如你所说的,你在构建一个搜索引擎上下了很大的功夫,这一切都是关于选择、赞成和反对的。完美的引擎是不存在的,这就是为什么谷歌和谷歌都在不断发展的原因。谷歌:他们已经为你发明了轮子,为什么不使用他们的?你自己永远也得不到这么好的东西!记住:作为一名开发人员意味着要聪明lazy@MichaelDibbets:我对我的答案进行了编辑,或者更确切地说,增加了一些“建议”。如果你正在构建一个SE,我会说一个查询不应该超过你SE总速度的15%,这在待办事项列表中,以供将来参考。好的,这是一个建议,我可以做一些事情。我一直在找这种东西,但是找不到。我觉得谷歌搜索很糟糕。我会努力的。谢谢你的链接!如果您使用的是UTF8排序规则(可能是这种情况),那么给定PHP标记,MySQL的REGEXP引擎可能会产生意外的结果。谷歌提供更多信息,但也有其他注意事项,例如,LIKE
在某些情况下可能会使用索引,而不像regex。但你的情况不是这样。对不起,但是一个对每一次搜索都进行这种操作的搜索引擎对你的服务器来说是相当毁灭性的。。。
ALTER TABLE articles ADD FULLTEXT(title,text,source,unique);