有哪些方法可以改善这个长的mysql搜索查询?

时间:2011-07-19 16:43:18

标签: php mysql database phpmyadmin

希望改进搜索查询的mysql select语句:

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%'
)

它之所以破碎的原因,是因为如果有人搜索“艺术”,我不希望它也显示“心脏”的结果。

我确实需要具有相同的功能,但运行的资源更少。

3 个答案:

答案 0 :(得分: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 :(得分: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?

答案 2 :(得分:0)

重构数据库,使标记存储在单独的表中,问题上的每个标记都有一行,以便您可以运行如下查询:

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

根据您希望搜索关键字的工作方式,您可以在那里使用类似的解决方案。