Mysql搜索每个单词

Mysql搜索每个单词,mysql,sql,string,Mysql,Sql,String,假设我有一个列“x”和一个记录:“一二你好五”。 我想搜索一个特定的单词(例如“hello”),如果它存在,则给出这个记录作为结果 我尝试过“选择(…)其中x类似于“hello”-没有匹配项 我不想使用“SELECT(…)WHERE x,比如“%hello%”,因为它会给我一些记录,其中“hello”可以包含在另一个单词中(f.e.“rhellog”-我不想这样做) 我不想要正则表达式'RLIKE'[[::]]-因为它太慢了 是否有其他选项可以搜索给定列中的确切单词,但速度不如正则表达式慢?您是

假设我有一个列“x”和一个记录:“一二你好五”。 我想搜索一个特定的单词(例如“hello”),如果它存在,则给出这个记录作为结果

  • 我尝试过“选择(…)其中x类似于“hello”-没有匹配项
  • 我不想使用“SELECT(…)WHERE x,比如“%hello%”,因为它会给我一些记录,其中“hello”可以包含在另一个单词中(f.e.“rhellog”-我不想这样做)
  • 我不想要正则表达式'RLIKE'[[::]]-因为它太慢了
  • 是否有其他选项可以搜索给定列中的确切单词,但速度不如正则表达式慢?

    您是否尝试过:

    SELECT (...) WHERE x LIKE '% hello %
    
    hello
    的两边都有空格

    您是否尝试过:

    SELECT (...) WHERE x LIKE '% hello %
    
    hello
    的两边都有空格

    尝试使用

    SELECT (...) WHERE x LIKE '% hello %' or x LIKE 'hello %' or x LIKE '% hello'
    
    尝试使用

    SELECT (...) WHERE x LIKE '% hello %' or x LIKE 'hello %' or x LIKE '% hello'
    

    如果您想提高速度,请使用全文搜索索引。如果列包含类似于用空格分隔的标记的内容,那么您的数据结构错误,需要另一个表

    如果使用一致的单词分隔符,您可以像使用一样执行所需的操作:

    where concat(' ', x, ' ') like '% hello %'
    

    但这不会比regex版本快多少。regex版本更为通用,因为它允许更多的分词符。

    如果您想提高速度,请使用全文搜索索引。如果列包含类似于用空格分隔的标记的内容,那么您的数据结构错误,需要另一个表

    如果使用一致的单词分隔符,您可以像使用一样执行所需的操作:

    where concat(' ', x, ' ') like '% hello %'
    

    但这不会比regex版本快多少。regex版本更通用,因为它允许更多的单词分隔符。

    通常,对于这样的用例,您应该考虑MySQL是否是该任务的最佳数据库。您可以搜索
    %hello%
    ,或者按照其他人的建议,您可以使用regex。但你必须意识到,与其他允许你搜索文本的数据库相比,这些数据库的速度都会很慢

    下一个选项是使用
    match(column)对抗('hello')
    ,如果您有最新版本,则可以利用


    您最好的选择是真正评估您的用例。如果这是针对少量数据,那么上述任何一项都可能有效。但是,如果您有数百万个文档和数百万个事务,那么您最好的选择是使用类似于使用Lucene索引单词的东西

    通常,对于这样的用例,您应该考虑MySQL是否是最适合这项工作的数据库。您可以搜索
    %hello%
    ,或者按照其他人的建议,您可以使用regex。但你必须意识到,与其他允许你搜索文本的数据库相比,这些数据库的速度都会很慢

    下一个选项是使用
    match(column)对抗('hello')
    ,如果您有最新版本,则可以利用


    您最好的选择是真正评估您的用例。如果这是针对少量数据,那么上述任何一项都可能有效。但是,如果您有数百万个文档和数百万个事务,那么您最好的选择是使用类似于使用Lucene索引单词的东西

    你说得对,使用
    REGEXP
    速度很慢,像使用通配符一样使用

    通过全文索引可以很好地解决您的需求。这是MySQL中内置的一项功能:,或者您也可以使用ApacheSolr或Sphinx Search等工具独立索引数据

    您可能会发现我在比较MySQL的不同全文搜索解决方案时所做的介绍很有用

    • 幻灯片:
    • 网络研讨会视频:

    你说得对,使用
    REGEXP
    速度很慢,像使用通配符一样使用

    通过全文索引可以很好地解决您的需求。这是MySQL中内置的一项功能:,或者您也可以使用ApacheSolr或Sphinx Search等工具独立索引数据

    您可能会发现我在比较MySQL的不同全文搜索解决方案时所做的介绍很有用

    • 幻灯片:
    • 网络研讨会视频:
    其中x类似于“%hello%”
    具有类似于“[[::]”的x的
    
    说明:

  • 这样的
    速度更快,但会得到一些您不想要的行
    
  • RLIKE
    仅应用于通过类过滤的类,因此其缓慢性不是太大的问题
  • (是的,
    全文
    会快得多。)

    其中x像“%hello%”
    具有类似于“[[::]”的x的
    
    说明:

  • 这样的
    速度更快,但会得到一些您不想要的行
    
  • RLIKE
    仅应用于通过类过滤的类,因此其缓慢性不是太大的问题

  • (是的,
    全文
    会快得多。)

    使用
    regex
    是你最好的选择。如果你想要速度,请使用全文搜索功能。@gordon-你是什么意思?请参阅我在MySQL 5.7中关于全文搜索的答案使用
    regex
    是你最好的选择。如果你想要速度,请使用全文搜索功能。@gordon-你是什么意思?请参阅我关于全文的答案在MySQL 5.7中搜索这是一个很酷的想法!但若单词是句子中的第一个或最后一个单词(并没有空格),那个么就使用or,例如…'其中x像“%hello%”或x像“%hello%”或x像“%hello%”这是个好主意!但若单词是句子中的第一个或最后一个单词(并没有空格),那个么就使用or,例如…'其中x类似于“%hello%”,或者x类似于“%hello%”,或者x类似于“%hello%”