MySQL按相关性搜索所有字段

时间:2014-01-07 19:26:24

标签: php mysql sql

我确信这是可能的,但我认为写作可能非常复杂。我想通过以下方式搜索每个字段:

='SearchTerm' 然后 Like %SearchTerm 然后 like SearchTerm% 最后 like %SearchTerm%。我想在我的表格中的每个字段上运行它,这个字段大约有30或40个。是否有一种简单的方法可以在多个字段中运行它或者我是否必须声明每一个字段?

我想我之前看过一个查询,在此之前,%query%query%等之间的不同匹配是通过分配一个整数值然后按此排序来排名的。这样的查询是否可以实现?

非常感谢任何有关正确方向的建议和帮助。

3 个答案:

答案 0 :(得分:1)

您应该对要搜索的字段使用全文索引,并使用MATCH AGAINST而不是LIKE %%。它更快,并根据相关性返回结果。更多信息:

Mysql match...against vs. simple like "%term%"

答案 1 :(得分:0)

你应该有一些id来选择表格中的行。

您应该添加

id INT NOT NULL AUTO_INCREMENT PRIMARY KEY 

然后你可以使用

SELECT * FROM table WHERE column1 LIKE "%SearchTerm%" AND id BETWEEN 1 AND 40 

答案 2 :(得分:0)

我做了一些与你所描述的非常相似的东西(在php和mysql中)

这是我的代码:

$search = trim($_GET["search"]);
$searches = explode(" ",$search);
$sql = "SELECT *,wordmatch+descmatch+usagematch+bymatch as `match` FROM (SELECT id,word,LEFT(description,100)as description, 
         IFNULL((SELECT sum(vote)
                 FROM vote v
                 WHERE v.definition_id = d.id),0) as votecount,
            ";
$sqlword = "";
$sqldesc = "";
$sqlusage = "";
$sqlby = "";
foreach ($searches as $value) {
    $value = mysqli_real_escape_string($con,$value);
       $sqlword = $sqlword . "+ IFNULL(ROUND((LENGTH(word) - LENGTH(REPLACE(UPPER(word), UPPER('$value'), '')))/LENGTH('$value')),0)";
       $sqldesc = $sqldesc . "+ IFNULL(ROUND((LENGTH(description) - LENGTH(REPLACE(UPPER(description), UPPER('$value'), '')))/LENGTH('$value')),0)";
     $sqlusage = $sqlusage . "+ IFNULL(ROUND((LENGTH(`usage`) - LENGTH(REPLACE(UPPER(`usage`), UPPER('$value'), '')))/LENGTH('$value')),0)";
       $sqlby = $sqlby     . "+ IFNULL(ROUND((LENGTH(`by`) - LENGTH(REPLACE(UPPER(`by`), UPPER('$value'), '')))/LENGTH('$value')),0)";
}     
$sql = $sql . $sqlword ." as wordmatch,"
            . $sqldesc ." as descmatch,"
            . $sqlusage ." as usagematch,"
            . $sqlby ." as bymatch 
        FROM definition d
        HAVING (wordmatch > 0 OR descmatch > 0 OR usagematch > 0 OR bymatch > 0)
        ORDER BY 
        wordmatch DESC,
        descmatch DESC,
        usagematch DESC,
        bymatch DESC,
        votecount DESC)T1";
$queries[] = $sql;
$result = mysqli_query($con,$sql);

你可以在工作中看到这个http://unurbandictionary.comule.com/view_search.php?search=George+Miley+Cyrus这是我搜索“George Miley Cyrus”的时候 它的作用是爆炸搜索字符串以查找每个单词并返回每个单词中每个单词的出现次数,然后我执行ORDER BY以使相关性(优先级)首先返回。因此,在我的情况下,word字段具有最高相关性,然后是description字段,然后是usage字段,然后是by字段。
在我的代码版本之前,我使用的是LIKE,但它没有给我一个出现次数,因为我希望搜索词出现次数最多的行在其他行之前返回。