MySQL用FULLTEXT搜索包含字符

时间:2015-08-28 18:22:19

标签: php mysql full-text-search wildcard sql-like

我想升级当前的SQL搜索查询:

SELECT * FROM aab_movies WHERE title LIKE '%the walking%'

对于一个经过精心优化的搜索查询,如下所示:

SELECT * FROM aab_movies WHERE MATCH(title) AGAINST('+the +walking' IN BOOLEAN MODE)

这两个查询都在运行,但“优化”的查询有一个问题。哪个没有检索到正确的数据。每当我在寻找步行时,我只想要开始OR的项目包括“步行”。现在它检索包括''和'的所有内容。 “行走”(一种单元格中每个单词的分离)。

有人能解释/帮助我达到我想要的结果吗?它会受到很多赞赏!

简而言之:我想要检索数据,它开始OR包含给定的(整个)字符串(而不是分隔每个单词&然后将它们与给定的字符串进行比较)。

2 个答案:

答案 0 :(得分:2)

您想要的查询是:

SELECT *
FROM aab_movies
WHERE MATCH(title) AGAINST('"the walking"' IN BOOLEAN MODE)

然而,两个警告。一,你必须非常小心最小字长和术语长度。这可能会排除三个字母的单词(取决于构建索引时使用的设置)。

其次,你必须对停用词列表非常非常小心。像""将自动删除,因此您需要调整停用词列表。

您可以考虑像这样构建查询:

SELECT m.*
FROM (SELECT m.*
      FROM aab_movies m
      WHERE MATCH(title) AGAINST('+the +walking' IN BOOLEAN MODE)
     ) m
WHERE title like '%the walking%';

在许多情况下,内部查询只返回少量行。外部查询然后使用like,但这是在一小组数据上,性能可能是完全可以接受的。

答案 1 :(得分:0)

没关系,我已经设法解决了这个问题(当然是有人回答这个问题的帮助。)

对于我正在使用的引擎(innoDB),停用词列表未停用。我已经配置了my.ini,并应用了以下规则

[mysqld]
innodb_ft_min_token_size = 1
innodb_ft_enable_stopword = ''
ft_min_word_len = 1
ft_stopword_file = ''

这些基本上禁用了禁用词列表&将最小字长最小化为1.执行此操作后,您必须修复表(如果已完成FULLTEXT)。

SELECT * FROM aad_movies WHERE MATCH(title) AGAINST('"the walking"' IN BOOLEAN MODE)

查询是否正确:)

相关问题