首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在mysql表中搜索5个关键字

在mysql表中搜索5个关键字
EN

Stack Overflow用户
提问于 2014-09-08 05:29:52
回答 2查看 591关注 0票数 0

我试图从用户在MySQL表中输入的标签中搜索关键字,并根据匹配的数量返回最佳结果。

代码:

MySQL结构:

代码语言:javascript
复制
 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:

代码语言:javascript
复制
 $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匹配,如“0”、"king“2和"apple”2,因此总匹配将为2+2 = 4。
  3. 最后,比较从所有行中找到的匹配总数,并选择匹配最多的前3行。

第二个附加问题是如何忽略包含搜索关键字的单词,例如包含"king“但是另一个单词的”王国“。

更新:

根据有帮助的答案,我使用了全文搜索。

代码语言:javascript
复制
    $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‘这个短语,如下所示。

代码语言:javascript
复制
 id    | keywords       | phrase
 1     | bb king        | I was eating an apple when bb the king hit me
 2     | bb             | you fancy this brush?   
EN

回答 2

Stack Overflow用户

发布于 2014-09-08 07:12:16

正如Barmar所说,您可以使用全文函数:

代码语言:javascript
复制
SELECT id, customer_id, phrase 
FROM table
WHERE MATCH(phrase) AGAINST ('me wall like king apple');

如果也需要搜索另一列,则将其添加到MATCH中。

代码语言:javascript
复制
SELECT id, customer_id, phrase 
FROM table
WHERE MATCH(phrase,keywords) AGAINST ('me wall like king apple');

编辑:

对于第3点,您可以使用相同的函数:

代码语言:javascript
复制
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;,但只执行一次

票数 2
EN

Stack Overflow用户

发布于 2014-09-08 07:03:53

代码语言:javascript
复制
  $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.=")";                    

                 }

希望它能对你有用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25717935

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档