【问题标题】:What are some ways to improve this long mysql search query?有什么方法可以改进这个长的 mysql 搜索查询?
【发布时间】:2011-10-08 17:04:53
【问题描述】:

希望为搜索查询改进这个 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%'
)

之所以这样分解,是因为假设有人搜索“艺术”,我不希望它也显示“心脏”的结果。

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

【问题讨论】:

  • 你试过 FULLTEXT 索引吗?
  • 您能解释一下为什么要为$search_query %% $search_query% $search_query % 制作三个不同的案例吗?
  • 上面已经解释过了,例如,如果我搜索“art”并只使用 '%$search_query%' 那么它将返回“art”的每个实例,例如“心脏病发作”,我想避免那个。

标签: php mysql database phpmyadmin


【解决方案1】:

如果你的表是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

【讨论】:

    【解决方案2】:

    看起来像

    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?

    【讨论】:

    • LIKE '% heart %' 将不匹配 heart attack
    • @Quassnoi:不是这样,但'% $search_query%' 匹配artwiz
    • @black: SELECT REPLACE('artwiz', ',', '') LIKE '% art %'0 返回给我。
    • @Quassnoi:我说的是OR tag LIKE '$search_query%'
    • @black: 我说的是question 部分。
    【解决方案3】:

    重组你的数据库,将标签存储在一个单独的表中,一个问题的每个标签对应一行,这样你就可以运行如下查询:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-28
      • 1970-01-01
      • 2020-10-07
      相关资源
      最近更新 更多