MySQL:为什么我对全文索引的特定查询没有结果?
我有一些MySQL表和全文索引的麻烦。我的表结构类似于这样:MySQL:为什么我对全文索引的特定查询没有结果?
CREATE TABLE example_index (
id int(11) NOT NULL auto_increment,
title tinytext,
content text,
FULLTEXT INDEX title (title),
FULLTEXT INDEX titlecontent (title,content),
PRIMARY KEY (id)
)ENGINE=MyISAM;
正如你可以看到我已经创建了一个字段标题和组合的标题和内容的全文索引。此外,我还保存一些数据到这个表是这样的:
id | title | content
1 | Teamwork | Example data
2 | CSV-Export | Testdata
如果我试图通过对查询比赛获得从该表中的一些数据,然后我得到了下面的查询一个结果:
SELECT *
FROM example_index
WHERE MATCH (title) AGAINST('csv' IN BOOLEAN MODE);
但没有结果此查询:
SELECT *
FROM example_index
WHERE MATCH (title) AGAINST('Team' IN BOOLEAN MODE);
谁能告诉我,为什么我在这里有没有结果?
MySQL全文索引索引单词。这是一个非常重要的限制。您的数据中没有team
这个词,但您确实有csv
这个词,因为-
被认为是一个单词分隔符。
如果您正在寻找team
开始,那么你仍然可以使用字符串中使用*
操作全文索引的话要搜索:
SELECT *
FROM example_index
WHERE MATCH (title) AGAINST('Team*' IN BOOLEAN MODE);
如果你想获得含有记录子字符串team
任何地方内的索引字段,然后MySQL全文索引和全文搜索不能帮助你。在这种情况下,您需要恢复到旧的title like '%team%'
,或者您需要使用可以使用MySQL的其他全文搜索提供程序。
全文搜索寻找单词的文字不能偏字。由于您的文字包含“团队合作”,因此不包含团队。这是很多全文实现的限制。
如果你的数据不是太大,你可以使用like
:
SELECT *
FROM example_index
WHERE title LIKE '%Team%';
如果你只是在寻找与“团队”开始的标题,你可以这样做:
SELECT *
FROM example_index
WHERE title LIKE 'Team%';
的这种方法的优点是它将利用example_index(title)
上的常规索引。
我注意到MySQL现在有一个n-gram parser。此解析器专为非英语(主要是东亚语言)语言而设计。但是,它也可能适用于英语。你也许可以试试这个做你想做的事。
嗯ok thx,但我认为“喜欢”对我来说不是正确的,因为我的表将来会包含很多行。所以就像没有足够的性能来处理这一点。我已经看到,我也可以像这样使用通配符作为全文索引:AGAINST('Team *'IN BOOLEAN MODE),然后我也得到了一个结果。但我不知道如果这样比较好,或许你知道这件事? – Fox
@Fox。 。 。对,我忘了MySQL支持。当然,这应该比'like'更好。我认为它会使用词典来扩展搜索词,以包含词典中的所有匹配词。 –
好的,谢谢。我也在几分钟前试过这个解决方案,这对我来说工作得很好。你能告诉我,如果这是更高性能,然后类似的查询? – Fox
这取决于。如果单词'team'总是在字段的开头,那么你可以使用像'team%'这样的标题,它可以在一个字段上使用传统的索引。在这种情况下,“like”甚至可能比全文搜索更快。如果以'team'开头的单词可以在字段中的任何位置,那么您需要使用像'%team%'这样的标题,然后'like'不能使用索引,因此比全文搜索慢。 – Shadow
好的谢谢你:)。像这样的东西会很棒:'\ * team \ *',但是这不起作用:(所以我必须在这种情况下使用,或者我必须填写标题的内容字段:teamwork和content:team ,工作,所以我仍然可以使用匹配查询 – Fox