【问题标题】:mysql fulltext search cannot search dollar sign?mysql全文搜索无法搜索美元符号?
【发布时间】:2013-09-10 17:18:03
【问题描述】:

稍微细化一下问题

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

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

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

但是

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

成功了……

【问题讨论】:

  • 您能否省略美元符号并将其存储为数字数据类型。它可能会更有效率。
  • 如果 50% 以上的记录包含 $10,那么它将被忽略。
  • @juergend 这是文本搜索的规则吗?
  • 来自 Mysql 文档:此外,出现在 50% 或更多行中的单词被认为是常见的并且不匹配。
  • 我稍微细化了问题以增加清晰度,添加“IN BOOLEAN MODE”

标签: mysql


【解决方案1】:

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

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

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

【讨论】:

  • 我稍微细化了问题以增加清晰度,需要在一堆文本中搜索$
  • 通过 LIKE '%$%' + 常规 BTREE 索引而不是全文索引使用搜索,因为这种类型的搜索旨在查找特定的字符/字符串。 MATCH (..) AGAINST - 旨在通过 words 的词义进行匹配,例如来自同一个词根、听起来相似、具有相同含义的词,并且使用全文搜索索引考虑应用大量的词汇文本处理 - 在您的情况下不需要,因为您正在搜索字符/字符串而不是关键字
  • 在这里查看更多关于字符串比较函数dev.mysql.com/doc/refman/5.0/en/…
【解决方案2】:

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

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

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

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

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

更新 您是对的,您还需要将$ 添加为有效/包含的字符,否则它将被忽略。来自documentation

如果您想更改被视为单词的字符集 字符,您可以通过多种方式执行此操作,如 以下列表。进行修改后,您必须重建 包含任何 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 节,“为全文索引添加排序规则”。

【讨论】:

  • 我稍微细化了问题以增加清晰度,需要在一堆文本中搜索 $,ft_min_word_len=4 为我的设置
【解决方案3】:

您正在尝试匹配 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".

这基本上意味着您可以尝试全文搜索封闭搜索 双引号中的短语,只要美元符号是列值中 USD 和 price 之间的唯一特殊字符(它们之间也没有空格),您就可以获得所需的结果。但是,FULLTEXT 搜索是针对单词搜索的,特殊字符会被忽略,所以依赖这个是非常冒险的。

如果数据库中的更改是不可能的,也许您可​​以考虑使用 SPHINX 进行全文搜索。

【讨论】:

  • 我稍微细化了问题以增加清晰度,需要在一堆文本中搜索 $,但我的设置是正确的 ft_min_word_len=4
猜你喜欢
  • 2017-11-19
  • 1970-01-01
  • 2013-06-24
  • 1970-01-01
  • 2014-08-05
  • 1970-01-01
  • 1970-01-01
  • 2010-10-22
  • 2015-07-03
相关资源
最近更新 更多