忽略查询中的mysql全文停用词

时间:2012-10-01 18:30:29

标签: mysql full-text-search stop-words

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

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

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

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

1:苹果,橘子,芒果,香蕉 2:葡萄,橙子,菠萝,芒果 3:土豆,芒果,甜瓜,凯拉骑士

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

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

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

或者......我只是要删除禁用词列表......

6 个答案:

答案 0 :(得分:10)

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

ft_stopword_file = ""

重启mysql引擎并重建索引;

希望这项工作

答案 1 :(得分: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的速度差异。一个读取速度更快,其他写入速度更快(在互联网上阅读更多内容)

答案 2 :(得分: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:现在你的搜索工作正在......

答案 3 :(得分: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';

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

答案 4 :(得分:0)

对于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;

您的结果将如下所示: enter image description here

请注意use_stopword设置为0。

在此mysql documentation page.上搜索use_stopwords 和结帐innodb_ft_enable_stopword here

答案 5 :(得分:-1)

尝试使用MATCH ... AGAINST ...在BOOLEAN MODE中 像这个: MATERE MATCH(作者,标题) 反对('""'在布尔模式中);