2016-11-30 107 views
0

好吧,这是做我的灰色问题在我读过,并通过MySQL,并看了各种选项,我只能认为它是如此明显,我只是失明。全文mysql的搜索和匹配确切的字符串

总之,我做了一个标签云,过程的一部分是验证单词是否存在,如果有的话+1,但它必须是确切的短语。

所以我认为全文搜索是最好的选择。

举个例子。

$string = "hair dryer"; 

$string = '"'.$string.'"'; //enclose string in quotation marks to define must be an exact match 



//$string = mysqli_real_escape_string($mysqli,$string); // removed to see if this was effecting the result. 

$sql = "SELECT * FROM `search_keyword` WHERE Match (`keyword`) Against ('$string' IN BOOLEAN MODE) LIMIT 1"; 
$result=mysqli_query($mysqli,$sql); 

所以测试是在DB我有词“吹风机”一条线,它匹配了 - 好的结果

如果我改变字符串但是“头发”它仍然翻出“吹风机”,它不应该做它不完全匹配。

我已经读完了所有的方法,我尝试这个我得到了错误的结果。

(
[0] => Array 
    (
     [keyword] => hair dryer 
     [id] => 25 
    ) 

) /// should be empty and hair as a single row is not found 

请任何的建议是欢迎:-)

+0

那么为什么不''SELECT count(*)FROM ... WHERE Keyword = $ string'。如果你只想要一个特定的匹配。 – Mruf

+0

是的,它可以使用该方法,但是由于某些原因,每隔一段时间它就无法拾取现有单词,并且在不应该添加另一个单词的情况下又添加了另一个单词。所以我认为,如果我使用全文,我会得到一个更准确的方法,而不是创建重复。我很困惑,为什么它看起来很难让查询只提取完全匹配。 –

+0

如果我正确理解你的问题全文搜索不是正确的方向,因为全文创建倒排索引,即使你将限制字符限制为1,那么'头发'将匹配'吹风机'。 您需要像处理您的关键字之前处理您的关键字像修剪之前,strtolower然后使用以下查询SELECT count(*)FROM ... WHERE Keyword = trim($ string)或关键字字段上的组查询。 –

回答

0

你可以用PHP做。首先将您的字符串转换为数组,然后比较两个数组以查看是否存在匹配。

 $string = explode(" ",$string); 
     $sql = "SELECT keyword FROM search_keyword"; 
    $result=mysqli_query($mysqli,$sql); 
$compareArrays = array_intersect($result,$string); 
     if (is_array($compareArrays) && count($compareArrays) > 0) { 

做一些事情的结果就好像$ compareArrays是greter不止一个,这意味着你必须完全匹配。 array_intersect比较2个数组以查看是否有完全匹配。这样我不认为你会得到一个'头发'作为一个字符串的匹配,但你会得到一个'吹风机'。这是否工作?