为什么多次匹配语句后,+运算符将不再执行该作业? 我现在得到的结果包含 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
答案 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