我有像“some-or-other”这样的关键字,其中连字符在通过我的 mysql 数据库进行搜索时很重要。我目前正在使用全文功能。
有没有办法转义连字符?
我知道一种选择是在 myisam/ftdefs.h 文件中注释掉 #define HYPHEN_IS_DELIM
,但遗憾的是我的主机不允许这样做。还有其他选择吗?
这是我现在拥有的代码:
$search_input = $_GET['search_input'];
$keyword_safe = mysql_real_escape_string($search_input);
$keyword_safe_fix = "*'\"" . $keyword_safe . "\"'*";
$sql = "
SELECT *,
MATCH(coln1, coln2, coln3) AGAINST('$keyword_safe_fix') AS score
FROM table_name
WHERE MATCH(coln1, coln2, coln3) AGAINST('$keyword_safe_fix')
ORDER BY score DESC
";
最佳答案
从这里 http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html
查找带有破折号或连字符的单词的一种解决方案是在 bool 模式下使用全文搜索,并用双引号将带有连字符/破折号的单词括起来。
或从这里 http://bugs.mysql.com/bug.php?id=2095
还有另一种解决方法。它最近被添加到手册中: " 修改字符集文件:这不需要重新编译。 true_word_char() 宏 使用“字符类型”表来区分字母和数字 人物。 .您可以编辑其中一种字符集 XML 中的内容 文件来指定“-”是一个“字母”。然后使用给定的字符集 FULLTEXT 索引。 "
我自己没试过。
编辑:这里有一些更多的附加信息http://dev.mysql.com/doc/refman/5.0/en/fulltext-boolean.html
包含在双引号 (“"”) 字符中的短语仅匹配包含该短语的行,因为它是键入的。全文引擎将短语拆分为单词并在 FULLTEXT 索引中执行搜索词。在 MySQL 5.0.3 之前,引擎会在找到的记录中对短语执行子字符串搜索,因此匹配必须在短语中包含非单词字符。从 MySQL 5.0.3 开始,非单词字符不需要完全匹配:词组搜索只要求匹配项包含与词组完全相同且顺序相同的词。例如,“测试词组”匹配 MySQL 5.0.3 中的“测试、词组”,但之前不匹配。
如果短语不包含索引中的单词,则结果为空。例如,如果所有单词都是停用词或短于索引词的最小长度,则结果为空。
关于mysql - 如何允许在搜索查询中使用连字符进行全文搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5192499/