我第一次使用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包含(至少)WildstylezBrothersYeahFrontlinerWaveliner之一。这就是为什么你得到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(),您将只发现包含每个给定单词的艺术家。

如果这不是您想要的内容,请提供更多背景信息。

10-05 22:12