我有一个包含文章的表格和一个包含类别的表格。每个类别都有许多关键字,我想使用这些关键字来确定某篇文章是否属于某个类别。
我正在使用以下查询:
SELECT
path,
title,
description,
keywords
FROM
(
SELECT
path,
keywords,
(select title from article where id = 164016) as title,
(select description from article where id = 164016) as description
FROM
categories c
) as x
WHERE
MATCH (title, description) AGAINST ('my keywords' IN BOOLEAN MODE)
出于某种原因,由于MATCH的参数不正确,此查询无效,但我无法弄清楚它是什么。
答案 0 :(得分:0)
使用boolean fulltext search启用表达式的精确匹配。但是,此类搜索存在一些限制,如上面链接的文档所述:
双引号(“)字符中包含的短语仅匹配字面上包含短语的行,因为它是键入的。全文引擎将短语拆分为单词并执行搜索在单词的FULLTEXT索引中。非单词字符不需要完全匹配:短语搜索只需要匹配包含与短语完全相同的单词并且顺序相同。例如,“测试短语”匹配“测试,短语”。
如果短语不包含索引中的单词,则结果为 空。由于组合,单词可能不在索引中 因素:如果它们在文本中不存在,则是停用词,或者是 短于索引词的最小长度。
上述内容也意味着如果您在搜索表达式中有一个停用词或短于最小长度的单词,那么MySQL将不会返回任何匹配项。
SELECT path, keywords, MATCH (c.keywords) AGAINST ('"Here is some text"' IN BOOLEAN MODE) as relevance
FROM categories c
WHERE MATCH (c.keywords) AGAINST ('"Here is some text"' IN BOOLEAN MODE)
如果您想要完全匹配,则无法使用全文搜索。您需要使用like
运算符或=
运算符。
更新
title
是一个没有全文索引的计算字段。
against()
获取要搜索的字符串,以及指示要执行的搜索类型的可选修饰符。搜索字符串必须是在查询评估期间保持不变的字符串值。例如,这排除了表列,因为每行可能不同。
(source)
against()
函数中有一个字段名称,这是不允许的。