稍微改善问题
描述栏包含15美元,15美元的一组文字。
使用全文搜索IN BOOLEAN MODE但返回空结果
选择*来自书籍WHERE MATCH(描述)AGAINST('USD $ 15'IN BOOLEAN MODE); 空集(0.00秒)
但
选择*来自书籍WHERE MATCH(描述)反对('USD15'IN BOOLEAN MODE);
成功......
答案 0 :(得分:3)
不要对价格使用全文搜索,因为它旨在产生查询与适当文本之间的相关性。因此,它允许在大量文本中搜索特定关键字。索引包含单词的标记化版本,不能用于逐字符匹配。
使用DECIMAL(15,4)之类的东西,将货币设置移到单独的字段(ENUM / TINYINT)
在最坏的情况下(你不能影响表结构和插入的数据) - 你可以使用带有BTREE索引的常规CHAR / VARCHAR,并通过WHERE价格LIKE ...方法进行搜索。
答案 1 :(得分:1)
这可能是您的问题,而不是$
全文搜索中会忽略某些字词: 任何太短的单词都会被忽略。默认的最小长度 通过全文搜索找到的单词是四个字符。
http://dev.mysql.com/doc/refman/5.0/en/fulltext-natural-language.html
您可以在此处更改此设置 - 但请务必考虑所有其他3个字词的后果:my.cnf
另外 - @webdevbyjoss指出了实际的问题 - 如果只是为了匹配价格,这可以在全文搜索之外更好地处理。
的更新强> 的
你是对的,你还需要将ft_min_word_len = 3
添加为有效/包含的字符,否则它将被忽略。来自documentation:
如果要更改被视为单词的字符集 字符,您可以通过多种方式完成此操作,如中所述 以下列表。进行修改后,您必须重建 包含任何FULLTEXT索引的每个表的索引。假设 您想要将连字符(' - ')视为单词字符。 使用以下方法之一:
- 修改MySQL源:在myisam / ftdefs.h中,查看true_word_char()和 misc_word_char()宏。将' - '添加到其中一个宏中并重新编译MySQL。
- 修改字符集文件:这不需要重新编译。 true_word_char()宏使用“字符类型”表来区分字母和数字与其他字符。 。您可以在其中一个字符集XML文件中编辑数组的内容,以指定' - '是“字母”。然后使用给定的FULLTEXT索引字符集。有关数组格式的信息,请参见第10.3.1节“字符定义数组”。
- 为索引列使用的字符集添加新的排序规则,并更改列以使用该排序规则。有关添加排序规则的一般信息,请参见第10.4节“将排序规则添加到字符集”。有关特定于全文索引的示例,请参见第12.9.7节“为全文索引添加归类”。
醇>
答案 2 :(得分:0)
您正在尝试匹配3个字符的字符串,而默认值为4(我想这也是您的情况)。
它在MySQL文档的this页面上说:
Any word that is too short is ignored. The default minimum length of words that are found by full-text searches is four characters.
检查this微调全文搜索:
For example, if you want three-character words to be searchable,
you can set the ft_min_word_len variable by putting the following
lines in an option file:
[mysqld]
ft_min_word_len=3
<强>更新强>
来自MySQL文档:
A phrase that is enclosed within double quote (“"”)
characters matches only rows that contain the
phrase literally, as it was typed.
The full-text engine splits the phrase into words
and performs a search in the FULLTEXT index for the words.
Nonword characters need not be matched exactly:
Phrase searching requires only that matches contain exactly
the same words as the phrase and in the same order.
For example, "test phrase" matches "test, phrase".
这基本上意味着您可以尝试全文搜索封闭搜索 双引号中的短语,只要美元符号是列值中美元和价格之间唯一的特殊字符(它们之间也没有空格),您就可以获得所需的结果。但是,FULLTEXT搜索是为了进行单词搜索,而忽略了特殊字符,因此依赖于此非常危险。
如果数据库中的更改不可能,您可以考虑使用SPHINX进行全文搜索。