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

Jay*_*Jay 11 mysql search full-text-search special-characters hyphen

我有像"some-or-other"这样的关键字,其中连字符在搜索我的mysql数据库时很重要.我目前正在使用全文功能.

有没有办法逃脱连字符?我知道有一个选项是#define HYPHEN_IS_DELIMmyisam/ftdefs.h文件中注释掉,但不幸的是我的主机不允许这样做.还有其他选择吗?

编辑3-8-11这是我现在的代码:

$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
";
Run Code Online (Sandbox Code Playgroud)

Yas*_*lev 16

从这里http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

找到带有破折号或连字符的单词的一种解决方案是在BOOLEAN MODE中使用FULL TEXT SEARCH,并用双引号将连字符/破折号括起来.

或者从这里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中的"test,phrase",但之前不匹配.

如果短语不包含索引中的单词,则结果为空.例如,如果所有单词都是停用词或短于索引单词的最小长度,则结果为空.

  • 当然,尝试SELECT*FROM your_table_name WHERE MATCH(your_table_column_name)AGAINST('"SQL-MySQL"'IN BOOLEAN MODE); 点击这里查看摩尔信息http://dev.mysql.com/doc/refman/5.5/en/fulltext-boolean.html (2认同)

mgu*_*utt 5

有些人会建议使用以下查询:

SELECT id 
FROM texts
WHERE MATCH(text) AGAINST('well-known' IN BOOLEAN MODE)
HAVING text LIKE '%well-known%';
Run Code Online (Sandbox Code Playgroud)

但是,根据使用的全文运算符,您需要许多变体。任务:实现像+well-known +(>35-hour <39-hour) working week*. 太复杂了!

并且不要忘记ft_min_word_lenso的默认 lenup-to-datedate在您的结果中搜索返回。

诡计

因此,我更喜欢一个技巧,因此HAVING根本不需要使用etc 的结构:

  1. 而不是将以下文本添加到您的数据库表中:

    《最新的魔法师》是一部著名的科幻短篇小说。
    将不带连字符的连字符复制到评论内的文本末尾:
    《最新的魔法师》是一部著名的科幻短篇小说。<!-- UptoDate wellknown -->
    Run Code Online (Sandbox Code Playgroud)

  2. 如果用户搜索up-to-date删除 sql 查询中的连字符:
    MATCH(text) AGAINST('uptodate ' IN BOOLEAN MODE)

通过这种方式,您的用户可以找到up-to-date一个单词,而不是获取仅包含date(因为ft_min_word_lenkillsupto)的所有结果。

当然,在您阅读echo文本之前,您应该删除<!-- ... -->评论。

好处

  • 查询更简单
  • 用户可以像往常一样使用所有全文运算符
  • 查询速度更快。
  • 如果用户搜索-well-known +scienceMySQL 将其视为not include *well*, could include *known* and must include *science*. 这不是用户所期望的。这个技巧也解决了这个问题(当 sql 查询搜索时-wellknown +science