Php 匹配。。。反对';我想不出确切的结果
我第一次在php sql中使用MATCH…对抗,但是有一个问题困扰着我,我不知道如何解决它。这是我的代码:Php 匹配。。。反对';我想不出确切的结果,php,mysql,sql,full-text-search,Php,Mysql,Sql,Full Text Search,我第一次在php sql中使用MATCH…对抗,但是有一个问题困扰着我,我不知道如何解决它。这是我的代码: SELECT * FROM m_artist WHERE match(artist_name) against('". $_POST['article_content'] ."' IN BOOLEAN MODE) 这是$\u POST['article\u content']: Wildstylez Brothers Yeah Frontliner Waveliner 现在我的输出应该
SELECT * FROM m_artist WHERE match(artist_name) against('". $_POST['article_content'] ."' IN BOOLEAN MODE)
这是$\u POST['article\u content']:
Wildstylez Brothers Yeah Frontliner Waveliner
现在我的输出应该是:我数据库中的Wildstylez、Frontliner和Waveliner cause。除此之外,我还有伏特加兄弟,两个硬派兄弟,还有更多的兄弟这个词。如何修复SQL只选择文字匹配的问题?全文搜索实际上是一个很容易误导的名称:你可以通过你的查询来搜索全文(就像谷歌那样),但它不能保证全文等于你的查询 因此,根据您的输入,
Wildstylez Brothers Yeah
Frontliner Waveline被解释为Artister_name
包含(至少)一个Wildstylez
、Brothers
、Yeah
、Frontliner
和Waveliner
作为单词。这就是为什么您会得到例如包含兄弟的伏特加兄弟
,它包含兄弟
。对于类似谷歌的目的来说,这正是你想要的,因为你想获得一些你只知道的东西的详细信息,比如在音乐
上的show me文章中
您可能想使用
artist_name LIKE '%name_part1%' OR artist_name LIKE '%name_part2%' ...
或
最简单的情况是这样做
$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个Hardstyle兄弟的功能
另一种方法是用“+”作为所有单词的前缀,并坚持使用MATCH()反对()
,这样您将只找到包含所有给定单词的艺术家
如果这不是您想要的,请提供更多的上下文。文字匹配的定义比您使用的更精确。@Mihai那么我应该使用什么?您想要的根本不清楚。全文搜索搜索这些单词中的一个,这样它就可以工作了……我只想找到Wildstylez,Frontliner和Waveline,因为它们在数据库中。因为我用了“兄弟”这个词,所以它也可以找到伏特加兄弟,但这不是我想要的。问题是如何更改查询以使其工作@MihaiYou可以从澄清您正在使用的数据库开始。单靠它本身并没有多大帮助。你在起诉吗?
$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);