【问题标题】:How to use MySQL MATCH AGAINST IN BOOLEAN MODE to return results for at least 1 matching keyword inside a keywords string?如何使用 MySQL MATCH AGAINST IN BOOLEAN MODE 返回关键字字符串中至少 1 个匹配关键字的结果?
【发布时间】:2013-10-29 18:10:47
【问题描述】:

我有这个查询,用于根据在搜索框中输入的关键字搜索数据库条目。

// function to get search keywords from url
$q = furl($_GET['q']);

$sExp = preg_split('/\s+/',$q); 
$secure_keywords = array(); 
foreach ($sExp as $key=>$keyword){
    if (strlen($keyword) >= 3){ 
    // cut off words that are less than 3 chars
    $secure_keywords[] = $keyword;
    }
}
$kwords = count($secure_keywords); 
foreach ($secure_keywords as $key=>$keyword) 
{ 
// function to prevent sql injection
$keyword = sql_proof($keyword); 

$query="SELECT * FROM listings WHERE MATCH (meta_keywords) AGAINST ('$keyword' IN BOOLEAN MODE) ORDER BY id"; 
} 

当使用 2 个或更多单词时,如果至少有 1 个单词拼写错误,则查询将不会返回任何结果(即使输入的关键字中的其余单词确实存在结果)。例如,我输入“好”这个词,我得到至少 1 个结果,但是如果我使用“好点”,查询不会返回任何结果,所以它完全忽略了“好”这个词的匹配结果。 如果输入的关键字中至少有 1 个匹配词,查询是否可以匹配结果?谢谢

【问题讨论】:

  • 请提供您的实际 SQL 查询(在所有替换之后)和表中的数据样本以及预期结果和实际结果

标签: php mysql boolean mode match-against


【解决方案1】:

而不是使用“布尔模式”尝试

SELECT * FROM articles WHERE MATCH (title, body) AGAINST ('database test')

即使你在数据库之后没有像'test'这样的词,它也会返回结果

SELECT * FROM tablename WHERE MATCH (col1, col2) AGAINST ('string to be searched')

【讨论】:

  • 我已经尝试过了,但是如果删除了 IN BOOLEAN MODE,我会得到一个白页。还有什么建议吗?谢谢
  • 您是否尝试过 AGAINST('database' WITH QUERY EXPANSION) 而不是布尔模式
  • 是的,结果与我之前在布尔模式中删除时的结果相同。
  • 请发布您正在使用的查询
  • 尝试在查询中使用静态变量而不是 $keyword 来检查它是否工作,变量中的数据可能存在问题。
【解决方案2】:

查看以下解决方案,了解将结果与使用的任何关键字进行匹配的方法。另请查看文档以获取有关运算符和布尔 fst http://dev.mysql.com/doc/refman/5.1/en/fulltext-boolean.html的更多信息

// function to get search keywords from url
$q = furl($_GET['q']);

$sExp = preg_split('/\s+/',$q); 
$secure_keywords = array(); 
foreach ($sExp as $key=>$keyword){
    if (strlen($keyword) >= 3){ 
    // cut off words that are less than 3 chars
    $secure_keywords[] = $keyword;
    }
}
$kwords = count($secure_keywords); 

//init empty keywords array
$keywords = array();

//secure all keywords
$keywords = array_map(function($item){ return sql_proof($item); }, $secure_keywords); 

//implode the words with a space between
$keywords = implode(" ",$keywords);

//just one query with match against ANY of the words from initial keyword array
$query="SELECT * FROM listings WHERE MATCH (meta_keywords) AGAINST ('$keywords' IN BOOLEAN MODE) ORDER BY id"; 

【讨论】:

    猜你喜欢
    • 2013-10-15
    • 2013-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多