我是 MySQL 全文搜索的新手,今天遇到了这个问题:
我的公司表在名称列中有一 strip 有“e-magazine AG”的记录。我在名称列上有一个全文索引。
当我执行这个查询时,没有找到记录:
SELECT id, name FROM company WHERE MATCH(name) AGAINST('+"e-magazi"*' IN BOOLEAN MODE);
由于破折号,我需要使用引号并使用通配符,因为我实现了“键入时搜索”功能。
当我搜索整个术语“e-magazine AG”时,找到了记录。
知道我在这里做错了什么吗?我阅读了有关将破折号添加到单词字符列表(需要更新配置)的信息,但我正在寻找一种以编程方式执行此操作的方法。
最佳答案
这个条款
MATCH(name) AGAINST('+"e-magazi"*' IN BOOLEAN MODE);
将搜索 AND "e"AND NOT "magazi"
;即,“e-magazi”中的 -
将被解释为 not
,即使它在引号内也是如此。
因此,它不会按预期工作。
一个解决方案是应用一个带有 LIKE 的额外 having
子句。
我知道这个 having
很慢,但它只会应用于匹配的结果,因此不应涉及太多行。
我建议像这样:
SELECT id, name
FROM company
WHERE MATCH(name) AGAINST('magazine' IN BOOLEAN MODE)
HAVING name LIKE '%e-magazi%';
关于带有通配符和文字的 mysql boolean 模式全文搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7120403/