在全文搜索mysql中包含单个字母

时间:2016-02-24 14:24:33

标签: mysql search indexing full-text-search

我有一个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 4iPhone 5iPhone 6等搜索结果都会导致iPhone 4位于顶部。我该如何解决这个问题?

提前致谢。

2 个答案:

答案 0 :(得分:1)

全文索引,因此搜索基于单词,而不是模式。有一个适用于单词的最小长度参数,低于该长度的任何单词都不会被索引,因此不被视为结果加权的一部分。单个字符(6)可能低于限制,因此被丢弃。

你能做什么:

  1. 将最小长度限制降为1,请参阅mysql's documentation on fine tuning fulltext indexes
  2.   

    要索引的单词的最小和最大长度由。定义   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
    
    1. 将全文搜索更改为boolean mode并搜索确切的短语:
    2. 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) ;

      1. 转储全文搜索,只需使用like进行模式匹配。

答案 1 :(得分:0)

您可以尝试查询

SELECT title FROM device WHERE MATCH (title) AGAINST ('iPhone 6*' IN BOOLEAN MODE);

它应该找到包含诸如“iPhone 6”和“iPhone 6S”之类的单词的所有行。