2016-12-30 44 views
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的PARAMATERS这查询不工作,但我无法弄清楚它是什么。

回答

0

使用boolean fulltext search可以在表达式上进行精确匹配。但是,这些搜索有一些限制,如上面链接的文档所述:

双引号(“)字符中包含的短语仅与包含短语的行相匹配,因为它是键入的。 全文引擎将短语拆分成单词并执行的话全文索引搜索非词的字符不需要精确匹配:短语搜索只要求符合包含完全相同的单词作为短语和例如,“测试短语”匹配“test,phrase”

如果该短语不包含no那些在索引中的词,结果是 为空。由于 因素的组合,这些词可能不在索引中: 因素:如果它们不存在于文本中,是停用词,或者是短于索引词的最小长度的 。

以上也意味着,如果你有比搜索表达式的最小长度短停止字或一个词,那么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运营商或=运营商。

UPDATE

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

  2. against()

需要一个要搜索的字符串,以及一个可选的修饰符,表示什么类型的搜索来执行的。搜索字符串必须是查询评估期间不变的字符串值。这就排除了,例如,一个表列,因为它对每一行都不相同。

source

你必须在against()功能,这是不允许的字段名。

+0

谢谢你的回复。我认为我的目标不会与我以前的查询一起工作。我想我应该交换标题和关键字,所以我做了一个新的查询,这是给参数匹配上的错误。也许你知道什么是错的。 – MNL

+0

有什么方法可以工作?我改变了比赛对标题+描述(描述是全文),但它仍然不起作用。 – MNL

+0

因为我不知道你想达到什么目的,所以我不能帮你重新查询。我只能指出你的syntasx问题。 – Shadow