当我的搜索在全文搜索中包含“the”一词时,我遇到了问题。
这是我的有问题的搜索代码:
SELECT * FROM names WHERE MATCH(myname) AGAINST ('+the' IN BOOLEAN MODE)
这个效果很好:
SELECT * FROM names WHERE MATCH(myname) AGAINST ('+and' IN BOOLEAN MODE)
我已经关闭了 CNF 文件中的停用词,并使用 ft_min_word_len=3
和 innodb_ft_min_token_size=3
将最小字母更改为 3
我正在使用innodb。返回 27000 个结果,“the”从大约 500,000 条记录的数据库中返回 17000 个结果,所以我没有达到 50% 的标记,即便如此,我正在使用 bool 模式。我找不到另一个词来打破这个。有什么想法吗?
最佳答案
好吧,我终于明白了。看来我已经清除了 myisam 停用词,但没有清除 innodb 停用词。与 myisam 相比,这有点困难,但以下是其他可能需要它的人的步骤:
在/etc/my.cnf(或 Windows 上的 my.ini)中添加以下行:
创建停用词表。我在一个名为 settings
的数据库和一个名为 innodb-stopwords
的表中创建了我的。您不能只设置 innodb_ft_enable_stopword = 0
,您必须创建并链接到一个表。
确保您的表是 innodb 并添加名为 value
、varchar(?)、utf8_general_ci 的列。您可以将其留空或将值添加到表中。
innodb_ft_enable_stopword = 1
innodb_ft_server_stopword_table = settings/innodb-stopwords
重新启动您的 mysql 服务器。
删除并重新创建全文索引。
如果您不想重新启动服务器,可以使用动态设置变量(同时更新 cnf/ini 文件以供下次服务器重新启动)
--innodb_ft_enable_stopword=1
--innodb_ft_server_stopword_table=db_name/table_name
我没有看到任何重新创建索引的解决方法...不过,您可以在一个命令中完成此操作,因此表始终处于锁定状态,并且您的用户不会收到错误:
ALTER TABLE `tablename` DROP INDEX indexname, ADD FULLTEXT(`columnname`);
关于在 PHP 中搜索单词 "the"时 MySQL 5.6 全文搜索问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33420702/