14

我正在构建一个使用全文搜索的网站搜索。搜索本身效果很好,那不是我的问题。我将用户提供的关键字(匹配...反对...)与 AND 串在一起,以便多个词进一步缩小结果。现在,我知道某些停用词没有被索引,这对我来说很好,我真的不想将它们用作选择标准。但是,如果(由用户)在关键字集中提供了一个停用词,即使该词实际上在某个文本块中,它也会杀死所有结果(如预期的那样)。

我的问题:有没有办法在查询时检查某个单词是否是停用词?我的首选解决方案只是从搜索条件中排除相关的单词(我不在乎用户是否可以通过单词'neither'来缩小结果,我只是不希望 MySQL 返回一个空的结果集,因为用户提供它,即使结果中都不存在)。或者,我是否只需要清空停用词列表?非常感谢您的帮助。

编辑----我很抱歉,但实际上没有代码片段可以提供给这个。该代码工作正常,实际上完全符合预期。这更像是我正在处理的一个逻辑问题。但作为一个例子,以解释的方式:

假设有三个记录,其中包括单词(但不限于)

1:苹果、橙子、芒果、香蕉 2:葡萄、橙子、菠萝、芒果 3:土豆、芒果、甜瓜、keira knightly

如果用户输入的搜索词是芒果,则所有结果都正确返回。如果单词是橙色 AND 芒果,则返回结果 1 和 2(正确)。现在,假设香蕉是一个停用词(它不是……但我们假设它是),如果搜索的是橙色、芒果和香蕉,则不会返回任何结果(因为香蕉不在全文索引中)。

我正在寻找的是是否有其他人遇到过这个问题,并且有办法解决它。一种:

if 'banana' NOT STOP WORD match 'banana' against `words`. (OBVIOUSLY not real code).

或者......我是否只需要删除停用词列表......

4

6 回答 6

12

您可以通过比较所有停用词来验证关键字。这是 我找到的禁用全文停用词的解决方案的停用词列表。你只需要找到 .cnf 文件并添加这个,

ft_stopword_file = ""

重启mysql引擎并重建索引;

希望这个作品

于 2012-10-01T18:49:30.760 回答
3

如何在 MySQL 中禁用全文停用词:

在 my.ini 文本文件 (MySQL) 中:

ft_stopword_file = ""   or link an empty file "empty_stopwords.txt"
ft_min_word_len = 2 

// 设置最小长度,但要注意较短的单词 (3,2) 会显着增加查询时间,尤其是在全文索引列字段很大的情况下。

保存文件,重启服务器。

下一步应该是使用此查询修复索引:

REPAIR TABLE tbl_name QUICK.

但是,如果您的表使用 InnoDB 存储引擎,这将不起作用。您必须将其更改为 MyISAM :

ALTER TABLE t1 ENGINE = MyISAM;

所以,再一次:

1. Edit my.ini file and save
2. Restart your server (this cannot be done dynamically)
3. Change the table engine (if needed)  ALTER TABLE tbl_name ENGINE = MyISAM;
4. Perform repair                       REPAIR TABLE tbl_name QUICK.

请注意,InnoDB 和 MyISAM 有它们的速度差异。一个读得更快,另一个写得更快(在互联网上阅读更多相关信息)

于 2013-08-02T15:20:43.857 回答
1

使用此步骤在 mysql 中禁用全文搜索的停用词

1:在mysql中打开my.ini文件

2:放在 my.ini 中 [mysqld] 行之后的两行以下(在文件中搜索 [mysqld])

ft_min_word_len=1
ft_stopword_file=""

3:重启你的服务器

4:使用以下命令修复您的表

 > repair table tablename;

5:现在您的搜索正在工作......

于 2013-12-18T07:46:38.680 回答
1

对于 INNODB 情况,可以在创建索引时禁用 stop_words。

SET @@SESSION.innodb_ft_enable_stopword = 'OFF';

create table foo
....
fulltext (search_col)

这将导致在禁用停用词的情况下创建全文索引。您可以使用以下查询进行验证。

SET GLOBAL innodb_ft_aux_table = 'schema/foo';
select * from information_schema.innodb_ft_config;

您的结果将如下所示: 在此处输入图像描述

请注意,use_stopword 设置为 0。

use_stopwords在这个mysql 文档页面上搜索。并在这里 结帐innodb_ft_enable_stopword

于 2019-06-23T03:18:12.980 回答
0

设置 ft_stopword_file = ""
对我不起作用,我使用的是 INNODB 表和 MySQL 5.6(优化关联表后,停用词仍未在全文索引中编制索引)

此解决方案有效(即使您不是超级用户):

CREATE TABLE mydb.stopwordslist(value VARCHAR(20)) ENGINE = INNODB;
INSERT INTO mydb.stopwordslist(value) VALUES ('skipthisword');

对于所有用户,但您仍然需要超级用户权限:

SET GLOBAL innodb_ft_server_stopword_table = 'mydb/stopwordslist';

仅针对用户(假设它是重新创建索引和更新列的用户)

SET SESSION innodb_ft_user_stopword_table = 'mydb/stopwordslist';

因为它是一个会话变量,所以当您的会话关闭时它不会持续,所以请确保您在每个会话或优化或插入具有全文索引的表之前或更新由全文索引索引的列时设置它

于 2017-11-22T16:09:36.567 回答
-3

尝试使用 MATCH...AGAINST...IN BOOLEAN MODE 像这样: WHERE MATCH(author,title) AGAINST('"origin of"' IN BOOLEAN MODE);

于 2014-06-16T09:55:02.580 回答