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.
的不同的全文搜索提供程序
我在使用 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.