【问题标题】:SQL search query like stackoverflowSQL 搜索查询,如 stackoverflow
【发布时间】:2011-09-02 16:33:14
【问题描述】:

就像用户在输入框写文章标题一样,我想搜索现有文章,看看是否有类似的。

例如。

SQL search query like stackoverflow

我想查找与此标题相关的最相关文章。

我知道是这样的:

WHERE article_title LIKE 'word'

但是如何处理多个关键字呢?

【问题讨论】:

    标签: php mysql search


    【解决方案1】:

    使用全文索引,类似于:

    SELECT ... FROM ... WHERE MATCH (fieldname) AGAINST ('keyword keyword keyword');
    

    或者修改查询看起来像

    SELECT ... FROM ... WHERE (fieldname LIKE '%keyword%' OR fieldname LIKE '%keyword%' etc...)
    

    在这两者中,全文版本会更快,因为它可以使用索引。 'LIKE %...% 版本将非常昂贵,因为这种通配符搜索根本无法使用索引。缺点是全文索引仅适用于 MyISAM 表,并且可能永远不会适用于 InnoDB 表。

    【讨论】:

    • hmm 该字段没有全文,我发现我可以用CREATE INDEX fulltext2 ON articles(article_title(255)); 添加它,谢谢
    • 感谢提到通配符之类的查询会破坏性能。它们根本无法很好地扩展。
    【解决方案2】:

    您需要对此进行全文搜索。

    确保您使用 MyISAM 作为您要搜索的表的引擎。

    有下表

    Table articles
    --------------
    id integer autoincrement PK
    title varchar(255) with fulltext index
    contents textblob with fulltext index
    

    并使用如下查询:

    SELECT id
      , MATCH(title, contents) AGAINST ('$title_of_article_thats_being_edited') 
      as relevance
    FROM articles
    WHERE MATCH(title, contents) AGAINST ('$title_of_article_thats_being_edited') 
    ORDER BY relevance
    

    请注意,当您输入标签时,SO 会优化列表。

    【讨论】:

      【解决方案3】:

      WHERE article_title LIKE '%word1%word2%'

      将按此特定顺序返回 article_title 包含“word1”和“word2”的所有行

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-08
        • 2016-04-18
        • 2016-09-10
        • 2016-01-06
        • 2010-12-03
        • 2015-03-09
        • 2011-12-06
        • 1970-01-01
        相关资源
        最近更新 更多