MySQL全文期间

时间:2014-02-11 08:01:58

标签: mysql text

我有一个产品名称表,全文很有效,直到使用一段时间,例如寻找3.7电池..我试试

select .. where match(name) against ('+3.7v +battery' in boolean mode)

我看到了用双引号括起句号的建议,即against ('+\"3.7v\"' in boolean mode)against ('\"3.7v\"' in boolean mode)

既不会返回任何结果。 我查看了停用词的默认列表(https://dev.mysql.com/doc/refman/5.1/en/fulltext-stopwords.html),但未看到指定的句点。

我看了http://dev.mysql.com/doc/refman/5.6/en/fulltext-fine-tuning.html并看到ft_min_word_len是3,这应该适合..

有人有任何建议吗?

编辑:/dev.mysql.com/doc/refman/5.6/en/fulltext-natural-language.html说FULLTEXT解析器通过查找某些分隔符来确定单词的开始和结束位置;例如,“”(空格),“,”(逗号)和“。”(句号)。

我猜这些分隔符与停用词列表不同。有没有办法在不修改源代码的情况下配置它们?不幸的是我使用InnoDB,最近才添加了全文功能,而且只能为5.6中的MyISAM表创建全文解析器插件

2 个答案:

答案 0 :(得分:0)

正如Fine-Tuning MySQL Full-Text Search所述:

  

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

     
      
  • 修改MySQL源代码:在storage/myisam/ftdefs.h中,请参阅true_word_char()misc_word_char()宏。将'-'添加到其中一个宏中并重新编译MySQL。

  •   
  • 修改字符集文件:这不需要重新编译。 true_word_char()宏使用“字符类型”表来区分字母和数字与其他字符。 。您可以在其中一个字符集XML文件中编辑<ctype><map>数组的内容,以指定'-'是“字母”。然后使用给定的FULLTEXT索引字符集。有关<ctype><map>数组格式的信息,请参阅Section 10.3.1, “Character Definition Arrays”

  •   
  • 为索引列使用的字符集添加新的排序规则,并更改列以使用该排序规则。有关添加归类的一般信息,请参阅Section 10.4, “Adding a Collation to a Character Set”。有关特定于全文索引的示例,请参阅Section 12.9.7, “Adding a Collation for Full-Text Indexing”

  •   

答案 1 :(得分:0)

where match(name) against ('+battery' in boolean mode)
  AND name LIKE '%3.7v%'

构造查询时,这需要您的应用程序具有一定的智能性。

其他变体:

这可确保3.7v电池旁边:

where match(name) against ('+battery' in boolean mode)
  AND name LIKE '%3.7v battery%'

这确保它周围有单词边界:

where match(name) against ('+battery' in boolean mode)
  AND name REGEXP '[[:<:]]3.7v[[:>:]]'