mysql - 如何允许在搜索查询中使用连字符进行全文搜索

标签 mysql search full-text-search special-characters

我有像“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/

相关文章:

sql-server - 如何在全文搜索中为不同列分配权重?

ruby-on-rails - pg_search gem 和全文搜索排名设置

mysql - 使用数组 id 进行内连接

mysql - 如何从具有这些条件的表中进行选择?

PHP 和 MySQL 分页更新帮助

search - Emacs:结合 isearch-forward 和 center-top-bottom

arrays - 使用过滤器搜索,无法正常工作 - Parse、Swift

使用文本搜索查找所有可能结果的算法

php - 如何解决 Laravel 中的登录错误

mysql - 任何第三方搜索引擎(全文搜索等)都可以很好地处理 InnoDB 表吗?