我想升级当前的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包含给定的(整个)字符串(而不是分隔每个单词&然后将它们与给定的字符串进行比较)。
答案 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)
查询是否正确:)