带有通配符和文字的 mysql boolean 模式全文搜索

标签 mysql boolean wildcard full-text-search literals

我是 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/

相关文章:

java - 如何让java在退出程序时保存数据

vb6 - Visual Basic 6 如何将整数转换为 boolean 值?

CSS 将通配符应用于伪类

mysql - 显示 MySQL 中 2 个可比记录的 Null 值

MySQL临时变量赋值

perl - 被 perl 中一个非常简单的 if/else 语句弄糊涂了

Java 8 泛型与通配符的问题

java - 如何使用带通配符的集合和泛型?

mysql - SQL 循环使用另一个表中的值填充值

MySQL : query three times on the same table