Jay*_*Jay 11 mysql search full-text-search special-characters hyphen
我有像"some-or-other"这样的关键字,其中连字符在搜索我的mysql数据库时很重要.我目前正在使用全文功能.
有没有办法逃脱连字符?我知道有一个选项是#define HYPHEN_IS_DELIM
在myisam/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 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_len
so的默认 lenup-to-date
仅date
在您的结果中搜索返回。
诡计
因此,我更喜欢一个技巧,因此HAVING
根本不需要使用etc 的结构:
而不是将以下文本添加到您的数据库表中:
《最新的魔法师》是一部著名的科幻短篇小说。将不带连字符的连字符复制到评论内的文本末尾:
《最新的魔法师》是一部著名的科幻短篇小说。<!-- UptoDate wellknown -->
Run Code Online (Sandbox Code Playgroud)如果用户搜索up-to-date
删除 sql 查询中的连字符:
MATCH(text) AGAINST('uptodate ' IN BOOLEAN MODE)
通过这种方式,您的用户可以找到up-to-date
一个单词,而不是获取仅包含date
(因为ft_min_word_len
killsup
和to
)的所有结果。
当然,在您阅读echo
文本之前,您应该删除<!-- ... -->
评论。
好处
-well-known +science
MySQL 将其视为not include *well*, could include *known* and must include *science*
. 这不是用户所期望的。这个技巧也解决了这个问题(当 sql 查询搜索时-wellknown +science
)