mysql全文布尔搜索运算符无效

时间:2011-06-30 11:27:22

标签: mysql

为什么多次匹配语句后,+运算符将不再执行该作业? 我现在得到的结果包含 OR ziekenhuis,OR bed,OR hospital ,...

我想得到( ziekenhuis和床医院和床)......

谢谢!

SELECT * FROM archief WHERE MATCH(description, keywords) 
AGAINST('+ziekenhuis +bed' IN BOOLEAN MODE) 
OR MATCH(description, keywords) AGAINST('+ziekenhuis +bed' IN BOOLEAN MODE) 
OR MATCH(description, keywords) AGAINST('+hospital +bed' IN BOOLEAN MODE) 
OR MATCH(description, keywords) AGAINST('+lit +d\'hôpital' IN BOOLEAN MODE)

AND showa = '1' 
AND rel_date <= '20110630' 
ORDER BY datetaken desc LIMIT 50

1 个答案:

答案 0 :(得分:0)

如果您使用ft_min_word_len为4的默认设置,则查询中的3个字母单词可能会被忽略。

您可以检查以下设置:

show variables like 'ft_min_word_len';

如果要将3个字母的单词编入索引,则需要更改配置文件中的设置并重新启动MySQL。例如,打开你的/etc/my.cnf文件,在[mysqld]部分添加/更新这一行:

ft_min_word_len = 3

然后重启MySQL服务器以使更改生效。如果要将短语单词编入索引,还应考虑将该值设置得更低。您应该查看MySQL默认的stopwords列表,看看您是否希望将这些单词编入索引。您可以忽略停用词列表并将所有单词编入索引,将其添加到my.cnf文件的[mysqld]部分:

ft_stopword_file = ''

此外,您不需要使用多个MATCH语句,您可以在要匹配的字符串的布尔逻辑中完成所有操作。

更新服务器后尝试此操作:

SELECT * 
FROM archief 
WHERE 
MATCH(description, keywords) 
  AGAINST('(+ziekenhuis +bed) (+hospital +bed) (+lit +d\'hôpital)' IN BOOLEAN MODE) 
AND showa = '1' 
AND rel_date <= '20110630' 
ORDER BY datetaken desc 
LIMIT 50