我对查询进行了以下匹配,根据搜索短语从数据库表中搜索记录。
SELECT * FROM My_Table WHERE MATCH (catchall) AGAINST ('"horse"' IN BOOLEAN MODE)
此查询正常运行。当搜索短语包含特殊字符,如'('等它只是跳过这些特殊字符。 如果我搜索“(马)”,它给出了与“马”相同的结果。
SELECT * FROM My_Table WHERE MATCH (catchall) AGAINST ('"(horse)"' IN BOOLEAN MODE)
这是否意味着匹配查询不适用于特殊字符或我错过了什么。请建议。谢谢。 我尝试从查询中删除IN BOOLEAN MODE但它不起作用。
答案 0 :(得分:2)
括号将单词组合成子表达式。括号内的组可以嵌套。
如果你想将prenthes视为“单词字符”,有两种可能性:
如果要更改被视为单词的字符集 字符,你可以通过两种方式实现。假设你想要对待 连字符(' - ')作为单词字符。使用其中任何一个 方法:
修改MySQL源:在myisam / ftdefs.h中,查看true_word_char() 和misc_word_char()宏。将' - '添加到其中一个宏和 重新编译MySQL。
修改字符集文件:这不需要重新编译。该 true_word_char()宏使用“字符类型”表来区分 来自其他角色的字母和数字。 。你可以编辑 要指定的一个字符集XML文件中的内容 ' - '是一个“字母。”然后使用给定的字符集 FULLTEXT索引。
进行修改后,必须重建每个索引 包含任何FULLTEXT索引的表。
第三种方法是根本不使用MATCH ... AGAINST
并使用LIKE
代替 - 但这可能会变得复杂(如果您想使用其他运算符的全文搜索,例如{ {1}} / +
)并减慢查询速度。