在 PHP 中搜索单词 "the"时 MySQL 5.6 全文搜索问题

标签 mysql full-text-search innodb

当我的搜索在全文搜索中包含“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=3innodb_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/

相关文章:

postgresql - 函数 ts_rank_cd(text, tsquery) 不存在

MySQL全文索引和常规索引搜索

sql - 设计 SQL 替代方案?

mysql - 计算 2 列的发生次数

php - 连接 2 个查询并发送到 mysql_query

mongodb 全文搜索和 json 对象

java - 用java使用excel工作表作为数据库

mysql - 从docker容器访问主机mysql

mysql - 为什么这个 mysql 查询返回不正确的行

php - 如何使用一种形式将数据发送到mysql数据库中的不同表