2010-08-29 117 views
2

我正在编写一些代码来自动标记一些文章。MySQL:在全文搜索中查找多个单词 - 完全匹配只有

我有一个标签数组和一个文章表。我运行下面的查询,以检查匹配标签头条:

SELECT headline 
    FROM `news` 
WHERE MATCH(headline) AGAINST ("+Green +Day" IN BOOLEAN MODE) 

这个发现与标题完全一样的短语“绿日”的所有文章 - 没有第一个+,我得到的仅包含这个词的文章“绿色'。

这并不完美,有些标签会导致不准确的结果 - 例如一个名为Die! Die! Die!(不要求)的标签会返回每个标题中带有“die”字样的标题。

有什么明显的我在这里失踪?我想要的只是包含整个短语的标题,而不是输入。

回答

3

据我在docs中看到的,使用引号就足够了。从文档页面上的例子:

“有些话”

寻找包含原短语“some words”的(例如,包含“一些智慧的话”行行,但不“一些噪音词”)。请注意,““”字符括起来的短语是界定短语的操作符字符它们不是包围搜索字符串本身的引号

+0

你是对的 - 不能相信我错过了这个。谢谢! – 2010-08-29 21:14:06

0

如果你想整个短语匹配,那么你应该这样做:

SELECT headline FROM news WHERE headline LIKE '%Green Day%'

,将返回你的结果在标题短语“绿日”。

+0

不是 - 先试了一下。适用于“绿色日”,但如果我有一个像“Error”这样的标签,它也会将标题与“恐怖”一词相匹配。 – 2010-08-29 21:12:38

+0

@Matt - 那么你应该尝试使用正则表达式搜索和设置字边界 – 2010-08-29 21:14:29

+0

...或使用全文索引:) – 2010-08-29 21:15:59

1

@马特 - 。比赛的原因‘恐怖’采用米奇的代码是因为你没有第一个%字符后留下的空间。 精确搜索的单个单词的正确语法应该是这样的

SELECT headline FROM news WHERE headline LIKE '% Green Day %' 

这将管理中检索搜索中输入的单词请求完全相同的方式。

2

你必须在双引号附近放置额外的单引号,这意味着确切的单词查询。 +运算符仅表示AND逻辑。

SELECT headline 
    FROM `news` 
WHERE MATCH(headline) AGAINST ('"+Green +Day"' IN BOOLEAN MODE)