MYSQL如何匹配句子中的两个单词

时间:2014-04-05 06:58:47

标签: mysql regex database

我有一个包含mytext的列表,其中包含句子。

我想按任意顺序搜索有两个单词的句子,如“我的”“学校”。

我想要的结果是

  1. 牛津是我的学校

  2. 我的名字是kk school is jes

4 个答案:

答案 0 :(得分:2)

查询:

SELECT * 
FROM mytable 
WHERE mycolumn LIKE "%my%" 
and mycolumn LIKE "%school%";

还会返回如下句子:

  • “mysql school”
  • “我的老父母”

但我们不想要它们。

你可以试试这个:

SELECT * 
FROM mytable 
WHERE mycolumn regexp ' my |^my | my$'
and mycolumn regexp ' school |^school | school$'

但是如果在列mycolumn中你有句话:

  • 我爱我的学校!

你应该考虑增加另一个条件:

SELECT * 
FROM mytable 
WHERE mycolumn regexp ' my |^my | my$'
and mycolumn regexp '[^a-zA-Z]school[^a-zA-Z]|^school | school$'

答案 1 :(得分:1)

如果你正在使用InnoDB表(你可能也是),你可以使用LIKE语句:

SELECT * FROM mytable WHERE mycolumn LIKE "%my%" OR mycolumn LIKE "%school%";

对于全文搜索,更好的解决方案是使用针对此类目的进行优化的专用搜索引擎 - 例如elasticsearch

答案 2 :(得分:0)

您可以使用FULLTEXT搜索。

全文搜索基于FULLTEXT索引,可以仅为MyISAM表创建,也仅为TEXT列和非BINARY CHAR和VARCHAR列创建。

FULLTEXT搜索不区分大小写。这是因为可以使用FULLTEXT索引的列类型的结果。

在你的情况下:

SELECT * FROM mytable WHERE MATCH(mycolumn)AGAINST('my school');

答案 3 :(得分:0)

您可以使用

SELECT * FROM table1 WHERE mycolumn REGEXP '(?=.*\bmy\b)(?=.*\bschool\b)';

(?=,这是一个积极的展望。它与模式匹配而没有消耗字符
.*可以匹配任意数量的任意字符
\b与单词边界匹配

You can read more about this here
and here

这是一种不错的方法,因为您可以添加新单词,而只需添加更多积极的前瞻,例如:

SELECT * FROM table1 WHERE mycolumn REGEXP '(?=.*\bmy\b)(?=.*\bspecial\b)(?=.*\bschool\b)';

(要在HeidiSQL等某些应用中对其进行测试,可能需要使用\来转义\)