0

我有一个带有文章的表格和一个带有类别的表格。每个类别都有许多关键字,我想使用这些关键字来确定一篇文章是否属于某个类别。

我正在使用以下查询:

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 的参数不正确,此查询无法正常工作,但我无法弄清楚它是什么。

4

1 回答 1

1

使用布尔全文搜索来启用表达式的精确匹配。但是,如上面链接的文档所述,此类搜索存在一些限制:

包含在双引号 (") 字符中的短语仅匹配包含按字面意思输入的短语的行。全文引擎将短语拆分为单词并在 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运算符或=运算符。

更新

  1. title在这种情况下,是一个没有全文索引的计算字段。

  2. against()

接受一个要搜索的字符串和一个可选的修饰符,指示要执行的搜索类型。搜索字符串必须是在查询评估期间保持不变的字符串值。例如,这排除了表格列,因为每行可能不同。

来源

您在函数中有一个字段名称against(),这是不允许的。

于 2016-12-30T15:36:43.923 回答