[英]Search 5 keywords in mysql table
我正在尝试从用户在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);
....那就是我被困住的地方。 我的想法是:
搜索将针对每个关键字(例如“ me”,“ wall”,“ like”等)执行
对于每个关键字,它将在表的每一行中搜索“关键字”和“短语”两列,并返回找到的匹配项数。 例如,搜索针对第一行输入的关键字将返回关键字“ me”具有0个匹配项,“ wall”具有0个匹配项,“ like” 0,“ king” 2和“ apple” 2。因此,总匹配项将为2 +2 = 4
第二个问题是如何忽略包含搜索关键字的单词,例如包含“ king”但又是另一个单词的“ kingdom”。
更新:
按照有用的答案,我使用了全文搜索。
$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返回空结果,未找到任何行。 但是我在下表的至少两行中确实有短语“ bb”。
id | keywords | phrase
1 | bb king | I was eating an apple when bb the king hit me
2 | bb | you fancy this brush?
正如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;
此查询将返回三个最佳匹配
有关更多信息,请参阅手册
更新:
根据手册:
在全文搜索中,某些单词会被忽略:
任何太短的单词都会被忽略。 全文搜索发现的默认最小单词长度为四个字符。
停用词列表中的单词将被忽略。 停用词是一个非常普遍的词,例如“ the”或“ some”,以至于它被认为具有零语义值。 有一个内置的停用词列表,但是可以由用户定义的列表覆盖。
您正在使用一个简短的单词进行搜索,这就是为什么您没有得到任何结果的原因。
更新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;
但只有一次
$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.=")";
}
希望它对您有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.