我有一个mysql后端,其后面有一个名为device
的表。表title
中的列是我需要搜索的位置。标题栏包含一些手机的名称。以下是表格中的示例数据集:
+----+----------------------+
| id | title |
+----+----------------------+
| 1 | Apple iPhone 4 |
| 2 | Apple iPhone 4S |
| 3 | Apple iPhone 5 |
| 4 | Apple iPhone 5S |
| 5 | Apple iPhone 6 |
| 6 | Apple iPhone 6 Plus |
| 7 | Apple iPhone 6S |
| 8 | Apple iPhone 6S Plus |
+----+----------------------+
我使用以下命令在此表上创建了一个FULLTEXT索引:
CREATE FULLTEXT INDEX idx ON device(title);
当我使用以下MySQL命令搜索时:
SELECT title FROM device WHERE MATCH (title) AGAINST ('iPhone 6');
最重要的结果是iPhone 4。
我所观察到的是,它忽略了最后的单个数字。如果我搜索iPhone 6S
,我会在顶部找到正确的行。但是iPhone 4
,iPhone 5
,iPhone 6
等搜索结果都会导致iPhone 4位于顶部。我该如何解决这个问题?
提前致谢。
答案 0 :(得分:1)
全文索引,因此搜索基于单词,而不是模式。有一个适用于单词的最小长度参数,低于该长度的任何单词都不会被索引,因此不被视为结果加权的一部分。单个字符(6)可能低于限制,因此被丢弃。
你能做什么:
要索引的单词的最小和最大长度由。定义 InnoDB的innodb_ft_min_token_size和innodb_ft_max_token_size 搜索索引,以及myISAM的ft_min_word_len和ft_max_word_len 的。
进一步考虑:
- Fulltext indexes have to be rebuilt after this change
- Fulltext indexes may grow extremely big with this change
SELECT title FROM device WHERE MATCH (title) AGAINST ('"Iphone 6"' IN BOOLEAN MODE) ;
或
SELECT title FROM device WHERE MATCH (title) AGAINST ('Iphone 6*' IN BOOLEAN MODE) ;
like
进行模式匹配。答案 1 :(得分:0)
您可以尝试查询
SELECT title FROM device WHERE MATCH (title) AGAINST ('iPhone 6*' IN BOOLEAN MODE);
它应该找到包含诸如“iPhone 6”和“iPhone 6S”之类的单词的所有行。