如何让php搜索类似的单词

时间:2016-07-13 10:53:54

标签: php

我有一个搜索框,用户可以在其中输入。这个输入文本将在数据库中搜索,结果将通过语法检索..

$sql = "SELECT * FROM new WHERE FNAME LIKE '%$a%' LIMIT 0, 30 ";
$result = $conn->query($sql);
if ($result->num_rows > 0) 
{
    while($row = $result->fetch_assoc()) 
    {
        {
        echo '<tr>';
         echo $row["FNAME"];
        echo '<br>';
        echo '</tr>';
        }
    }
}

它的工作但我的问题是我想搜索类似的单词。 例如,如果有人搜索emran,我的数据库必须要给imran .....

3 个答案:

答案 0 :(得分:0)

只需将where子句改为

即可
where soundex(FNAME) = soundex('$a')

where FNAME sounds like '$a'

答案 1 :(得分:0)

您可能希望根据作为搜索字符串传递的第一个字符构建查询。如果第一个字符是元音(a,e,o,i,u),则可以运行一个函数来使用这些元音构建所有可能的组合。这就是:

    <?php
        $searchTerm     = 'emran';
        $probableTerms  = buildProbableSearchTerms($searchTerm);

        $sql    = "SELECT * FROM new WHERE FNAME LIKE '{$probableTerms}' LIMIT 0, 30 ";
        $result = $conn->query($sql);
        if ($result->num_rows > 0)
        {
            while($row = $result->fetch_assoc())
            {
                {
                    echo '<tr>';
                    echo $row["FNAME"];
                    echo '<br>';
                    echo '</tr>';
                }
            }
        }

        function buildProbableSearchTerms($searchTerm){
            $searchTerms    = "";
            if(strlen($searchTerm)<1){
                return "";
            }
            $arrVowels  = array("a", "e", "i", "o", "u");
            $arrSString = str_split($searchTerm);
            if(in_array(strtolower($arrSString[0]), $arrVowels)){
                array_splice($arrSString, 0, 1);
                foreach($arrVowels as $vowel){
                    $searchTerms .= "%{$vowel}" . implode("", $arrSString) . "% OR ";
                }
                $searchTerms = rtrim($searchTerms, " OR ");
            }else{
                $searchTerms .= "%{$searchTerm}%";
            }
            return $searchTerms;

        }



        var_dump($probableTerms);
        // DISPLAYS: '%amran% OR %emran% OR %imran% OR %omran% OR %umran%'

答案 2 :(得分:0)

由于您正在搜索用户特定的名称,因此即使用户在搜索时出现任何拼写错误,也没有这样的直接方法可以为您提供适当的结果。

它就像构建自己的算法一样,如果没有找到它将首先寻找直接匹配,然后它将寻找检测相似名称并返回结果。

我想到的其他选项是创建另一个列,它将存储在输入原始名称时发生的所有常见拼写错误。在您的情况下,列FNAME将包含imran和FNAME_SEARCH(根据要求的任何名称) )它将包含常见的错误,如emraan,omran等。

所以你的查询看起来像这样,

$sql = "SELECT * FROM new WHERE FNAME LIKE '%$a%' OR FNAME_SEARCH LIKE '%$a%' LIMIT 0, 30 ";