Соответствие точности поискового слова возможно с использованием расстояния Левенштейна

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

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

Сделал поиск в Google и дошел до этого момента

   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;

person user1064660    schedule 06.12.2011    source источник
comment
Вы уверены, что определенно хотите сделать это на PHP? Если вы хотите найти совпадения (или близкие совпадения), это то, что правильно обрабатывается на стороне БД. Пожалуйста, дайте нам знать.   -  person rdlowrey    schedule 06.12.2011
comment
как говорит @rdlowery, вам, вероятно, лучше передать ответственность MySQL - прочтите stackoverflow.com/questions/634995/ и artfulsoftware.com/infotree/queries.php#552 для решения ...   -  person HorusKol    schedule 06.12.2011


Ответы (2)


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

Ло Зауэр article может помочь вам в этом.

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

person Mestre San    schedule 04.03.2014
comment
Это должен быть принятый ответ, поскольку он будет работать лучше, потому что MySQL уже сузит данные и, возможно, очень хорошо их проиндексирует. Вы также можете сохранить значение SOUNDEX в отдельном столбце - person twicejr; 05.08.2014

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

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

    - Создать процедуру с параметром поиска CREATE PROCEDURE sp_SearchInterests (IN p_SearchParam VARCHAR (30)); DELIMITER //

    ВЫБЕРИТЕ Interest_desc ИЗ интересов ГДЕ Interest_desc = p_SearchParam ИЛИ Interest_desc LIKE '% pSearchParam%' //

    КОНЕЦ; DELIMITER;

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

person Phrancis    schedule 02.06.2014
comment
Легко и качественно? Обычно это выступает против использования хранимых процедур. Потому что они ... просто плохи в MySQL. Кроме того, в 90% случаев, если намерение состоит в использовании сохраненного кода, то пора подумать, следует ли перенести этот код в application. Наконец, приведенный выше код не имеет ничего общего с расстоянием Левенштейна. - person Alma Do; 02.06.2014
comment
Ярмарка Re: Дистанция Левенштейна. Хотя вышеупомянутый процесс будет работать очень быстро, если это все, что он пытается сделать, я думаю, что Левенштейн может быть излишним. - person Phrancis; 02.06.2014