2011-07-19 37 views
2

展望改善搜索查询这个mysql的select语句:有什么方法可以改善这个长长的mysql搜索查询?

Select * from table WHERE (user = '$search_query' 
OR user LIKE '$search_query %' 
OR keyword LIKE '$search_query' 
OR tag LIKE '$search_query' 
OR tag LIKE '% $search_query' 
OR tag LIKE '% $search_query%' 
OR tag LIKE '$search_query%' 
OR REPLACE(question, ',' ,'') LIKE '$search_query %' 
OR REPLACE(question, ',' ,'') LIKE '% $search_query' 
OR REPLACE(question, ',' ,'') LIKE '% $search_query %' 
OR REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(question, '\'', ''), ',', ''), '.',''), ':',''), ';',''), '!',''), '?','') LIKE '%$search_query%' 
) 

它打破了事情是这样的原因,是因为说,如果有人搜索“艺术”,我不希望它显示结果为“心脏”。

我真的需要有这些相同的功能,但运行的资源较少。

+2

您是否尝试过FULLTEXT索引? – Wrikken

+0

您能否解释为什么您为'$ search_query%','%$ search_query'和'%$ search_query%'做出三种不同情况的原因? – dave

+0

这是上面解释的,例如,如果我搜索“艺术”,只是使用'%$ search_query%',那么它会返回每个“艺术”的实例,如“心脏病发作”,我想避免这种情况。 – user761479

回答

4

如果你的表是MyISAM,你可以在其上创建FULLTEXT指数:

CREATE FULLTEXT INDEX fx_mytable_user_tag_question ON mytable (user, tag, question) 

SELECT * 
FROM mytable 
WHERE MATCH(user, tag, question) AGAINST ('+some*' IN BOOLEAN MODE) 

这个查询将返回somesomething但不awesome

实际上,第一步(创建索引)不是必需的,但它会加快查询速度并允许更复杂的搜索(不限于BOOLEAN MODE)和相关性测距。

默认情况下,搜索查询的最小长度为4个字符,因此您的示例中提到的art将不会被找到。

要解决此问题,您必须在服务器设置中更改参数ft_min_word_len

1

它看起来像

OR tag LIKE '$search_query' 
OR tag LIKE '$search_query%' 

将返回相同的结果只能运行

OR tag LIKE '$search_query%' 

同样的,

OR tag LIKE '% $search_query' 
OR tag LIKE '% $search_query%' 

搜索周围的这个问题,我才知道,MySQL的支持regular expression searches。使用这些,如果您能够指定%应匹配的模式。这将有助于所有这些讨厌的空间,因为你可以使用\s?

+0

'LIKE'%heart%''不符合'心脏病发作'。 – Quassnoi

+0

@Quassnoi:不是,但是'%$ search_query%''匹配'artwiz'。 – dave

+0

@black:'SELECT REPLACE('artwiz',',','')LIKE'%art%'''将'0'返回给我。 – Quassnoi

0

重组你的数据库,使得标签存储在一个单独的表,用一行就某一问题每个标签,这样就可以运行像一个查询:你怎么想搜索的关键词

SELECT * FROM question 
WHERE question_id IN (
    SELECT question_id FROM question_tags WHERE tag = '$search_query' 
) OR <...> 

根据工作,你可能会在那里使用类似的解决方案。