我第一次使用MATCH ... AGAINST在php sql中工作,但是有一个困扰我,我不知道该如何解决。这是我的代码:
SELECT * FROM m_artist WHERE match(artist_name) against('". $_POST['article_content'] ."' IN BOOLEAN MODE)
这是
$_POST['article_content']:
Wildstylez Brothers Yeah Frontliner Waveliner
现在我的输出应该是:Wildstylez,Frontliner和Waveliner,原因在我的数据库中。我这样做,但除此之外,我还得到了伏特加兄弟,Hardstyle的2个兄弟,以及更多的兄弟一词。如何解决SQL仅选择文字匹配的问题?
最佳答案
全文搜索实际上是一个颇具误导性的名称:您可以通过查询来搜索全文(就像google一样),但不能保证您,全文就等于您的查询。
因此,根据documentation on Boolean Full-Text Searches,您的输入Wildstylez Brothers Yeah Frontliner Waveliner
被解释为artist_name
包含(至少)Wildstylez
,Brothers
,Yeah
,Frontliner
和Waveliner
之一。这就是为什么你得到the Vodka Brothers
,其中包含Brothers
。对于类似Google的目的,这正是您想要的,因为您想获取有关您仅了解的部分的详细信息,如在music
上的“向我展示”文章中所述。
您可能要使用
artist_name LIKE '%name_part1%' OR artist_name LIKE '%name_part2%' ...
要么
artist_name IN ('exact_name1', 'exact_name2', ...)
最简单的情况是做类似
$names = explode(' ', $_POST['article_content']);
$name_searches = array_map(function($a) {return 'artist_name = \''.mysql_real_escape_string($a).'\'';}, $names);
$sql = "SELECT * FROM m_artist WHERE ".implode(" OR ", $name_searches);
但是您会失去查找
2 Brothers of Hardstyle
的能力,因为名称本身包含空格。另一种方法是在所有单词前加上'+'并坚持
MATCH() AGAINST()
,您将只发现包含每个给定单词的艺术家。如果这不是您想要的内容,请提供更多背景信息。