Mysql搜索每个单词

时间:2016-08-10 18:06:14

标签: mysql sql string

假设我有一个带有记录的列'x':'one two hello five'。 我想搜索一个特定的单词(f.e.'hello'),如果它存在 - 作为结果给出这个记录。

  1. 我试过'SELECT(...)WHERE x LIKE'hello' - 没有匹配
  2. 我不想使用'SELECT(...)WHERE x LIKE'%hello%' - 因为它会给我记录'hello'可以包含在另一个单词中(fe'rhellog' - 我不这样做想要)
  3. 我不想要正则表达式'RLIKE'[[:<:]]你好[[:>:]]' - 因为它会慢下来
  4. 还有其他选项,它会在给定列中搜索确切的单词,但不像正则表达式那么慢吗?

6 个答案:

答案 0 :(得分:4)

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

假设一致的单词分隔符,您可以使用like执行所需的操作:

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

但这不会比正则表达式版本快得多。正则表达式版本更通用,因为它允许更多的单词分隔符。

答案 1 :(得分:0)

你试过了吗?

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

hello两侧有空格?

答案 2 :(得分:0)

尝试使用

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

答案 3 :(得分:0)

通常,对于这样的用例,您应该考虑MySQL是否是该作业的最佳数据库。您可以搜索%hello%或其他人建议您可以使用正则表达式。但是你必须意识到,与实际上让你搜索文本的其他数据库相比,这些都会变慢。

您的下一个选择是使用match(column) against ('hello'),如果您拥有最新版本,则可以使用fulltext search

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

答案 4 :(得分:0)

你是对的,使用REGEXP的速度很慢,因此LIKE使用通配符也是如此。

全文索引可以很好地解决您的要求。这是MySQL内置的一个功能:Full-Text Search Functions,或者您可以使用Apache Solr或Sphinx Search等工具独立索引数据。

您可能会发现我在比较MySQL的不同全文搜索解决方案时所做的演示。

答案 5 :(得分:0)

new

说明:

  1. WHERE x LIKE '%hello%' HAVING x RLIKE '[[:<:]]hello[[:>:]]' 速度更快,但会获得一些您不想要的行。
  2. LIKE仅适用于LIKE过滤的那些,因此它的迟缓不是太大的问题。
  3. (是的,RLIKE会更快。)