MySQL: 查找包含多个关键词的全文搜索 - 仅精确匹配

3

我正在编写一些代码来自动标记一些文章。

我有一个标签数组和一张文章表。我运行以下查询来检查标题是否与标签匹配:

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

这将查找所有标题中包含确切短语“Green Day”的文章 - 如果没有第一个+,则会得到仅包含单词“Green”的文章。
这并不完美,某些标签会导致不准确的结果 - 例如一个名为Die!Die!Die!(别问)的标签会返回每个标题中包含“die”一词的文章。
有什么明显的问题我漏掉了吗?我想要的只是获得包含整个短语,并以输入方式精确匹配的标题。
4个回答

4
据我所见,在文档中,使用引号应该就足够了。从文档页面的示例可以看出:
"一些单词" 查找包含完全短语“一些单词”的行(例如,包含“一些单词智慧”的行,但不包含“一些噪声单词”)。请注意,括住短语的“"”字符是操作符字符,用于界定短语。它们不是括住搜索字符串本身的引号。

2

您需要在双引号周围添加额外的单引号,以表示精确词汇查询。 + 运算符只表示 AND 逻辑。

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

0

@Matt - 使用Mitch的代码进行“Terror”匹配的原因是因为您在第一个%字符后没有留下空格。 单词精确搜索的正确语法应该像这样

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

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


-1
如果您想匹配整个短语,那么您应该这样做:
SELECT headline FROM news WHERE headline LIKE '%Green Day%'
这将返回标题中包含短语“Green Day”的结果。

不行 - 我先尝试了这个。对于“Green Day”很好用,但如果我有一个像“Error”这样的标签,它也会匹配包含单词“Terror”的标题。 - Matt Andrews
@Matt - 那你应该尝试使用正则表达式搜索并设置单词边界。 - Mitch Dempsey
...或者使用全文索引 :) - Pekka
@Pekka - 哈哈,我的错。我简直不敢相信我没有想到要用引号括起来。 - Mitch Dempsey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接