2011-12-06 35 views
6

tôi có bảng mySQL nơi mọi người thêm tên và sở thích của họ. Tôi muốn sử dụng một số loại từ phù hợp mà đi qua và tìm thấy hoặc là một trận đấu 100% hoặc một trận đấu gần. Tôi nghe nói về khoảng cách levenshtein nhưng không có đầu mối làm thế nào để làm cho nó chu kỳ thông qua bảng của tôi.Độ chính xác của từ tìm kiếm đối sánh có thể sử dụng khoảng cách Levenshtein

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

Xong một số googling và đã đến thời điểm

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; 
+0

Bạn có chắc chắn muốn thực hiện điều này trong PHP không? Nếu bạn muốn tìm kiếm các kết quả phù hợp (hoặc đóng các kết quả phù hợp) thì đây là thứ được xử lý đúng trên đầu DB. Xin vui lòng cho chúng tôi biết. – rdlowrey

+0

như @rdlowery cho biết, có lẽ bạn nên bỏ qua trách nhiệm với MySQL - hãy đọc http://stackoverflow.com/questions/634995/implementation-of-levenshtein-distance-for-mysql-fuzzy-search và http://www.artfulsoftware.com/infotree/queries.php#552 cho một giải pháp ... – HorusKol

Trả lời

1

này tôi nghĩ Soundex là một thay thế cho bạn.

Các Lo Sauer 's article có thể giúp bạn với điều đó

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

+0

Đây phải là câu trả lời được chấp nhận, vì nó sẽ hoạt động tốt hơn vì MySQL sẽ thu hẹp dữ liệu xuống và có thể lập chỉ mục nó cực kỳ tốt. Bạn cũng có thể lưu trữ giá trị SOUNDEX trong một cột riêng biệt – twicejr

0

Tôi nghĩ rằng sử dụng PHP để làm điều này là cách tiếp cận không chính xác, MySQL có thể dễ dàng và hiệu quả làm việc này. Tôi không chắc cấu trúc lược đồ của bạn là như thế nào, nhưng bạn có thể chỉ cần tạo một PROCEDURE trong MySQL với các tham số tìm kiếm và chỉ cần gọi nó từ PHP.

  1. Làm một cái gì đó tương tự như sau trong MySQL:

    - Tạo proc với thông số tìm kiếm CREATE sp_SearchInterests THỦ TỤC (IN p_SearchParam VARCHAR (30)); DELIMITER //

    CHỌN interest_desc TỪ lợi ích ĐÂU interest_desc = p_SearchParam HOẶC interest_desc LIKE '% pSearchParam%' //

    END; DELIMITER;

  2. Từ PHP chỉ CALL sp_SearchInterests('whateveryouwant') để trả lại kết quả mong muốn.

+0

Dễ dàng và hiệu quả? Bình thường mà phản đối "bằng cách sử dụng thủ tục lưu trữ". Bởi vì họ là ... chỉ xấu trong MySQL. Ngoài ra, trong 90% trường hợp, nếu ý định là sử dụng mã được lưu trữ - thì đã đến lúc nghĩ xem mã đó có nên được chuyển sang _application_ hay không. Cuối cùng, mã trên không có gì để làm với khoảng cách Levenshtein –

+0

Điểm công bằng Re: Levenshtein khoảng cách. Mặc dù trên proc sẽ chạy siêu nhanh nếu đó là tất cả những gì anh ta đang cố gắng làm, tôi nghĩ rằng Levenshtein có thể là quá mức cần thiết. – Phrancis

Các vấn đề liên quan