繁体   English   中英

在mysql表中搜索5个关键字

[英]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);

....那就是我被困住的地方。 我的想法是:

  1. 搜索将针对每个关键字(例如“ me”,“ wall”,“ like”等)执行

  2. 对于每个关键字,它将在表的每一行中搜索“关键字”和“短语”两列,并返回找到的匹配项数。 例如,搜索针对第一行输入的关键字将返回关键字“ me”具有0个匹配项,“ wall”具有0个匹配项,“ like” 0,“ king” 2和“ apple” 2。因此,总匹配项将为2 +2 = 4

  3. 最后,比较在所有行中找到的匹配总数,然后选择匹配度最高的前3行。

第二个问题是如何忽略包含搜索关键字的单词,例如包含“ 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_lenft_max_word_lenft_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM