我试图从用户在MySQL表中输入的标签中搜索关键字,并根据匹配的数量返回最佳结果。
代码:
MySQL结构:
id | keywords | phrase
1 | apple king pearl | I was eating an apple when the king hit me
2 | brush brute fancy | you fancy this brush?
3 | king queen kingdom | shall the queen obey the king or the kingdom?PHP:
$keywords_raw='me wall like king apple' //define keywords based on the tags the user inputs
$keywords=explode(' ', $keywords_raw);……那就是我被困在那里的地方。我的理想是:
第二个附加问题是如何忽略包含搜索关键字的单词,例如包含"king“但是另一个单词的”王国“。
更新:
根据有帮助的答案,我使用了全文搜索。
$keywords='bb';
$data['recommendation']=$this->db->query
("SELECT *, MATCH(keywords, phrase) AGAINST ('$keywords') as score
FROM game
WHERE MATCH(keywords, phrase) AGAINST ('$keywords')
ORDER BY score
LIMIT 3");
var_dump($data['recommendation']);
die;由于某种原因,var_dump返回一个没有找到行的空结果。但在表的至少2行中,我确实有'bb‘这个短语,如下所示。
id | keywords | phrase
1 | bb king | I was eating an apple when bb the king hit me
2 | bb | you fancy this brush? 发布于 2014-09-08 07:12:16
正如Barmar所说,您可以使用全文函数:
SELECT id, customer_id, phrase
FROM table
WHERE MATCH(phrase) AGAINST ('me wall like king apple');如果也需要搜索另一列,则将其添加到MATCH中。
SELECT id, customer_id, phrase
FROM table
WHERE MATCH(phrase,keywords) AGAINST ('me wall like king apple');编辑:
对于第3点,您可以使用相同的函数:
SELECT id, customer_id, phrase, MATCH(phrase,keywords) AGAINST ('me wall like king apple') as score
FROM table
WHERE MATCH(phrase,keywords) AGAINST ('me wall like king apple')
ORDER BY score
LIMIT 3;此查询将返回三个最佳匹配。
有关更多信息,看一下手册
更新:
根据手册:
有些词在全文搜索中被忽略:
你用一个简短的词来搜索,这就是为什么你没有得到任何结果。
更新09-09-14:
来自文档
如果修改了影响索引的全文变量(
ft_min_word_len、ft_max_word_len或ft_stopword_file),或者更改了秒针文件本身,则必须在进行更改和重新启动服务器后重新生成FULLTEXT索引。要重建本例中的索引,只需执行QUICK修复操作就足够了: mysql> 修复表tbl_name;
因此,在执行ALTER TABLE table ADD FULLTEXT(phrase, keywords);之后,您必须执行REPAIR TABLE tbl_name QUICK;,但只执行一次
发布于 2014-09-08 07:03:53
$keywords=explode(' ', $keywords_raw);
if(count($keywords)>1)
{
$stmt.="(";
$i=0;
foreach($arr_s1 as $kv)
{
if($i>0)
{
$stmt.=" AND ";
}
$stmt.=" phrase like '%".$kv."%'";
$i++;
}
$stmt.=")";
}希望它能对你有用。
https://stackoverflow.com/questions/25717935
复制相似问题