0

我有以下查询:

SELECT * FROM products WHERE is_active = 1 AND MATCH (full_text) AGAINST ('М 1050' IN BOOLEAN MODE)

此查询返回两条记录,这是两者的 full_index 列内容:

; 013 001 106;Ъглошлайф SPARKY M 1050 HD ; 1050W,10000об.,ф125мм ; 活泼的 ; 69; ; 040 070 1050;Вложка дванадесетограм удължена ; 1/4" 5мм FORSE /5295005/ ; FORCE ; 77 ;

但我只想要第一行,我不需要第二行。怎么了?

4

3 回答 3

3

除了user144590提供的答案;M默认情况下,不被视为一个单词。

文档

任何太短的单词都会被忽略。全文搜索找到的默认最小单词长度对于 InnoDB 搜索索引是三个字符,对于 MyISAM 是四个字符。您可以通过在创建索引之前设置配置选项来控制截止:InnoDB 搜索索引的 innodb_ft_min_token_size 配置选项,或 MyISAM 的 ft_min_word_len。

更新

在不更改最小长度的情况下,我猜您必须(在列数据中)将文本中的空格替换为'M 1050'另一个单词字符,例如'_'并匹配'M_1050'(在查询中),或者运行更慢的LIKE '%M 1050%'条件。

于 2014-09-18T11:17:27.740 回答
1

基于http://dev.mysql.com/doc/refman/5.5/en/fulltext-boolean.html

注意在实现这个特性时,MySQL 使用了有时被称为隐含布尔逻辑的东西,其中

加号(+)代表与

减号(-)代表NOT

[无运算符] 暗示 OR

所以本质上你正在做一个 OR,如果你需要这两个术语使用 +

SELECT * FROM products WHERE is_active = 1 AND MATCH (full_text) AGAINST ('+М +1050' IN BOOLEAN MODE)
于 2014-09-18T11:11:38.297 回答
0

如果要精确匹配某些单词,请使用双引号(例如'"М 1050"')

SELECT * FROM products WHERE is_active = 1 AND MATCH (full_text) AGAINST ('"М 1050"' IN BOOLEAN MODE)
于 2019-06-04T10:44:24.647 回答