MySQL FULLTEXT查询问题

问题描述 投票:1回答:2

我正在尝试使用mysql FULLTEXT进行查询,但不幸的是,即使表中包含那些输入关键字,它也会返回空结果。

表:user_skills:

+----+----------------------------------------------+
| id |                    skills                    |
+----+----------------------------------------------+
|  1 | Dance Performer,DJ,Entertainer,Event Planner |
|  2 | Animation,Camera Operator,Film Direction     |
|  3 | DJ                                           |
|  4 | Draftsman                                    |
|  5 | Makeup Artist                                |
|  6 | DJ,Music Producer                            |
+----+----------------------------------------------+  

索引:

Indexes for the abovr table

查询:

SELECT id,skills 
FROM user_skills 
WHERE ( MATCH (skills) AGAINST ('+dj' IN BOOLEAN MODE))  

这里,一旦我运行上面的查询,没有任何DJ行返回。在表中有3行,其值为dj

mysql sql full-text-search full-text-indexing
2个回答
3
投票

对于您要执行的操作,全文索引是错误的方法。但是,您的具体问题是最小字长,即3或4(默认情况下),具体取决于结尾。这在documentation中解释,特别是here

重置值后,您需要重新创建索引。

我怀疑你是想要聪明。您可能已经听过“不要在分隔字符串中存储事物列表”的建议。但你改为反对“啊,但我可以使用全文索引”。您可以,虽然您会发现更复杂的查询不能很好地优化。

做得对。创建关联表user_skills,每个用户和用户拥有的每项技能占一行。您会发现在查询中更容易使用,以防止重复,优化查询等。


3
投票

您的搜索字词很短

就像在mysql doc中一样

在全文搜索中会忽略某些单词:

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

.

布尔全文搜索具有以下特征:

他们不使用50%的门槛。

它们不会按相关性降低的顺序自动对行进行排序。您可以从前面的查询结果中看到这一点:具有最高相关性的行是包含“MySQL”两次的行,但它列在最后,而不是第一个。

即使没有FULLTEXT索引,它们也可以工作,尽管以这种方式执行的搜索会非常慢。

最小和最大字长全文参数适用。

https://dev.mysql.com/doc/refman/5.6/en/fulltext-natural-language.html

https://dev.mysql.com/doc/refman/5.6/en/fulltext-boolean.html

© www.soinside.com 2019 - 2024. All rights reserved.