首页 文章

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

提问于
浏览
2

要稍微改进一下这个问题

描述栏包含一堆文本中的15美元,15美元 .

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

select * from books WHERE MATCH(description)AGAINST('USD $ 15'IN BOOLEAN MODE);空集(0.00秒)

select * from books WHERE MATCH(description)AGAINST('USD15'IN BOOLEAN MODE);

成功......

3 回答

  • 0

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

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

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

  • 1

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

    在全文搜索中会忽略某些单词:忽略任何太短的单词 . 通过全文搜索找到的默认最小单词长度为四个字符 .

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

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

    另外 - @webdevbyjoss指出了实际问题 - 如果只是为了匹配价格,这可以在全文搜索之外更好地处理 .

    UPDATE 您是对的,您还需要将 $ 添加为有效/包含的字符,否则将被忽略 . 来自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节“为全文索引添加归类” .

  • 3

    你试图匹配3个字符串,而默认值是4(我想这也是你的情况) .

    它在MySQL文档的_835335页面上说:

    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
    

    UPDATE:

    来自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进行全文搜索 .

相关问题