首页 文章

对多列进行MySQL全文搜索无法提供预期的结果

提问于
浏览
0

我有一张名为'uploads'的表 . 列是id,date,last_update,description,tags . 我添加了全文索引'description_tags',其中包括列描述和标签 . 表格式是MyISAM . 如果这可能是问题,我正在使用USBWebserver .

现在我尝试选择其中包含提供的GET变量的上传 .

MATCH (description,tags) AGAINST ("'.urldecode($_GET['tags']).'")

但是我得到的结果的问题是:当我搜索'lorem'时没有结果,但是当我在查询中添加IN BOOLEAN MODE时有一个结果 . 'Lorem'实际上在描述栏中 . 在标签列中搜索关键字没有这个问题 . 当我搜索'moree'时也更有趣/烦人,这也是在描述表中,我得到有和没有布尔模式的结果...

这里有什么问题?我没有看到它 .

更新

if ( $upload_display_sort == 'popular' )//sort by popularity

$query =    //select 'u' (a new defined variable?)
            'SELECT u.* '.
            //from the following table
            'FROM '.
            //uploads table as variable u
            'uploads u '.
            //join the following table
            'LEFT OUTER JOIN '.
            //select the column upload_id, count all columns into variable 'num' ???
            '(SELECT upload_id, COUNT(*) AS num '.
            //from the favorites table as variable f
            'FROM favorites f '.
            //and group it by the upload_id in the favorites table
            'GROUP BY upload_id) '.
            //what does this do? combine rows where the u.id == f.upload_id ???
            'f ON u.id = f.upload_id';

else $query = 'SELECT * FROM uploads';//select all from uploads



$query .=   ' WHERE online_state = 1';//select all online uploads



//FILTER FAVORITES

if  ($upload_display_sort == 'favorites' and !empty($favorites_ids))

$query .= ' AND id IN ('.implode(',', $favorites_ids).')';//returns 1,2,3,4,5

elseif  ($upload_display_sort == 'favorites' and empty($favorites_ids))

$query .= ' AND id IN (0)';//no upload id is 0



//FILTER SEARCH

if  (   isset($_GET['tags'])    )

$query .= ' AND MATCH (description,tags) AGAINST ("'.urldecode($_GET['tags']).'" IN BOOLEAN MODE)';



//FILTER DATE

if  (   isset($_GET['timeframe']    )

    and (   $_GET['timeframe'] == '3days'

        or  $_GET['timeframe'] == '2weeks'

        or  $_GET['timeframe'] == '3months')    )

{

    $end_date = time();//current time in unix format

    switch  (   $_GET['timeframe']  )

    {
        case '3days':   $start_date = strtotime('-3 days',$end_date);   break;
        case '2weeks':  $start_date = strtotime('-2 weeks',$end_date);  break;
        case '3months': $start_date = strtotime('-3 months',$end_date); break;
        default:        $start_date = strtotime('');    break;//1970-01-01 01:00:00
    }

    $end_date = date("Y-m-d H:i:s", $end_date);//current time in mysql format

    $start_date = date("Y-m-d H:i:s", $start_date);//end time in mysql format

    $query .= ' AND last_update BETWEEN "'.$start_date.'" AND "'.$end_date.'"';

}



//ORDER

$query .= ' ORDER BY';

if ( $upload_display_sort == 'popular' )//sort by popularity

$query .= ' f.num DESC,';

$query .= ' last_update DESC, id DESC';

1 回答

  • 0

    您的测试数据可能不完整 . 请注意docs中的以下内容:

    50%或更多行中出现的单词被认为是常见的并且不匹配 .

    然而BOOLEAN MODE searches的不同之处在于:

    他们不使用50%的门槛 .

    我猜测“lorem”出现在50%或更多的行中 .

    BOOLEAN MODE 全文搜索请't automatically sort by decreasing relevance. You' ll需要自己对它们进行排序,如下所示:

    SELECT *, MATCH (description,tags) AGAINST ("lorem") AS relevance
    FROM uploads
    WHERE MATCH (description,tags) AGAINST ("lorem" IN BOOLEAN MODE)
    ORDER BY relevance DESC
    

相关问题