Совпадение точности поискового слова, возможно, с использованием расстояния Левенштейна - PullRequest
6 голосов
/ 06 декабря 2011

У меня есть таблица MySQL, где люди добавляют свои имена и интересы.Я хочу использовать какое-то совпадение слов, которое проходит и находит либо 100% совпадение, либо близкое совпадение.Я слышал о расстоянии Левенштейна, но понятия не имею, как заставить его проходить через мой стол.

    $input = $_POST["interest"];
    $result = mysql_query("SELECT interest_desc FROM interests");

Закончил поискать в гугле и дошел до этой точки

   function closest($seed, $haystack){
   $shortest = -1;
     foreach ($haystack as $word){
      $lev = levenshtein($seed, $word);
       if ($lev == 0) {
           $closest = $word; $shortest = 0; break;
       }
       if ($lev <= $shortest || $shortest < 0) {
       $closest  = $word; $shortest = $lev;
       }
}
return $closest;
}
$array = mysql_fetch_row($result);
$closestmatch = closest($input,$array);
echo $closetmatch;

Ответы [ 2 ]

1 голос
/ 05 марта 2014

Я думаю, что SOUNDEX - альтернатива для вас.

Статья Lo Sauer может помочь вам в этом

http://www.lsauer.com/2013/05/mysql-fuzzy-searching-fulltext-queries.html

0 голосов
/ 02 июня 2014

Я думаю, что использование PHP для этого является неправильным подходом, MySQL может легко и эффективно сделать это. Я не уверен, на что похожа вся ваша структура схемы, но вы могли бы просто сделать PROCEDURE в MySQL с параметрами поиска и просто вызвать его из PHP.

  1. Сделайте что-то похожее на это в MySQL:

    - Создать процесс с параметром поиска CREATE PROCEDURE sp_SearchInterests (IN p_SearchParam VARCHAR (30)); РАЗДЕЛИТЕЛЬ //

    ВЫБРАТЬ интереса_дес из интересов ГДЕ Interest_desc = p_SearchParam ИЛИ интереса_деск LIKE "% pSearchParam%" //

    END; РАЗДЕЛИТЕЛЬ;

  2. Из PHP просто CALL sp_SearchInterests('whateveryouwant'), чтобы вернуть желаемые результаты.

...