[英]MATCH … AGAINST doesn't come up with exact results
我第一次使用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一样),但这不能保证您,全文等于您的查询。
因此,根据有关布尔全文本搜索的文档,您的输入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()
然后您会发现只有包含每个给定单词的艺术家。
如果这不是您想要的内容,请提供更多背景信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.