mysql全文搜索无法搜索美元符号?

时间:2013-09-06 14:50:11

标签: mysql

稍微改善问题

描述栏包含15美元,15美元的一组文字。

使用全文搜索IN BOOLEAN MODE但返回空结果

选择*来自书籍WHERE MATCH(描述)AGAINST('USD $ 15'IN BOOLEAN MODE); 空集(0.00秒)

选择*来自书籍WHERE MATCH(描述)反对('USD15'IN BOOLEAN MODE);

成功......

3 个答案:

答案 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索引的每个表的索引。假设   您想要将连字符(' - ')视为单词字符。   使用以下方法之一:

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

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