MySQL: 为什么我对全文索引的特定查询没有结果?

MySQL: Why I get no results for a specific query on fulltext index?

我在使用 MySQL table 和全文索引时遇到一些问题。我的 table 结构类似于:

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;

如您所见,我已经为字段标题、标题和内容组合创建了一个全文索引。此外,我已将一些数据存储到此 table 中,如下所示:

id | title      | content
1  | Teamwork   | Example data
2  | CSV-Export | Testdata

如果我尝试通过与查询的匹配从这个 table 中获取一些数据,那么我会得到以下查询的一个结果:

SELECT *
FROM example_index
WHERE MATCH (title) AGAINST('csv' IN BOOLEAN MODE);

但是 此查询没有结果:

SELECT *
FROM example_index
WHERE MATCH (title) AGAINST('Team' IN BOOLEAN MODE);

谁能告诉我,为什么我在这里没有结果?

全文搜索查找文本中的 个词 ,而不是部分词。因为你的文字包含"Teamwork",所以不包含team。这是许多全文实现的局限性。

如果你的数据不是太大,可以使用like:

SELECT *
FROM example_index
WHERE title LIKE '%Team%';

如果您只想查找以 "Team" 开头的标题,您可以执行以下操作:

SELECT *
FROM example_index
WHERE title LIKE 'Team%';

这种方法的优点是它将利用 example_index(title) 上的常规索引。

我注意到 MySQL 现在有一个 n-gram parser。此解析器专为 non-English(主要是东亚)语言设计。但是,它也可能适用于英语。您或许可以尝试使用此方法来完成您想要的操作。

MySQL 全文索引索引 words。这是一个非常重要的限制。您的数据中没有单词 team,但是您有单词 csv,因为 - 被认为是单词分隔符。

如果您要查找 team 开头的词,那么您仍然可以在要搜索的字符串中使用 * 运算符使用全文索引:

SELECT *
FROM example_index
WHERE MATCH (title) AGAINST('Team*' IN BOOLEAN MODE);

如果您想获取索引字段中包含子字符串 team anywhere 的记录,那么 MySQL 全文索引和全文搜索无济于事你。在这种情况下,您要么需要恢复到良好的旧 title like '%team%',要么需要使用可以使用 MySQL.

的不同的全文搜索提供程序