2

将问题细化一点

描述列包含 15 美元,一堆文本中的 15 美元。

在布尔模式下使用全文搜索但返回空结果

从书中选择 * WHERE MATCH (description) AGAINST ('USD$15' IN BOOLEAN MODE); 空集(0.00 秒)

从书中选择 * WHERE MATCH (description) AGAINST ('USD15' IN BOOLEAN MODE);

成功了……

4

3 回答 3

3

不要使用全文搜索价格,因为它旨在产生查询和适当文本之间的相关性。因此,它允许在大量文本中搜索特定关键字。索引包含单词的标记化版本,不能用于逐字符匹配。

改用 DECIMAL(15,4) 之类的东西,并将货币设置移动到单独的字段(ENUM/TINYINT)

在最坏的情况下(您不能影响表结构和插入的数据) - 您可以使用带有 BTREE 索引的常规 CHAR/VARCHAR 并通过 WHERE price LIKE ... 方法进行搜索。

于 2013-09-06T15:01:04.490 回答
1

这可能是你的问题,而不是$

有些词在全文搜索中会被忽略:任何太短的词都会被忽略。全文搜索找到的默认最小单词长度为四个字符。

http://dev.mysql.com/doc/refman/5.0/en/fulltext-natural-language.html

您可以在此处更改此设置 - 但请务必考虑将被索引的所有其他 3 字符单词的后果:my.cnf在此设置上:ft_min_word_len = 3

另外 - @webdevbyjoss 指出了实际问题 - 如果只是想匹配价格,最好在全文搜索之外处理。

更新 您是正确的,您还需要添加$作为有效/包含的字符,否则它将被忽略。从文档中:

如果要更改被视为单词字符的字符集,可以通过多种方式进行,如下面的列表中所述。进行修改后,您必须为包含任何 FULLTEXT 索引的每个表重建索引。假设您要将连字符 ('-') 视为单词字符。使用以下方法之一:

  1. 修改 MySQL 源代码:在 myisam/ftdefs.h 中,查看 true_word_char() 和 misc_word_char() 宏。将“-”添加到这些宏之一并重新编译 MySQL。
  2. 修改字符集文件:这不需要重新编译。true_word_char() 宏使用“字符类型”表来区分字母和数字与其他字符。. 您可以在其中一个字符集 XML 文件中编辑数组的内容,以指定“-”是一个“字母”。然后为您的 FULLTEXT 索引使用给定的字符集。有关数组格式的信息,请参阅第 10.3.1 节,“字符定义数组”。
  3. 为索引列使用的字符集添加新的排序规则,并更改列以使用该排序规则。有关添加排序规则的一般信息,请参阅第 10.4 节,“将排序规则添加到字符集”。有关全文索引的特定示例,请参阅第 12.9.7 节,“为全文索引添加排序规则”。
于 2013-09-06T15:05:21.200 回答
0

您正在尝试匹配 3 个字符串,而默认值为 4(我想这也是您的情况)。

它在MySQL 文档的这个页面上说:

Any word that is too short is ignored. The default minimum length of words that are found by full-text searches is four characters.

检查以微调全文搜索:

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 进行全文搜索。

于 2013-09-06T15:06:08.313 回答