2011-12-06 12 views
6

का उपयोग कर मेरे पास एक MySQL तालिका है जहां लोग अपना नाम और अपनी रुचियां जोड़ते हैं। मैं कुछ प्रकार के शब्द मिलान का उपयोग करना चाहता हूं जो कि 100% मैच या एक करीबी मैच पाता है। मैंने लेवेनशेटिन दूरी के बारे में सुना लेकिन मुझे कोई सार नहीं है कि यह मेरी मेज के माध्यम से कैसे साइकिल बनायेगा।मिलान खोज शब्द सटीकता संभवतः लेवेनशेटिन दूरी

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

कुछ Googling हो गया और इस बात

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

क्या आप वाकई PHP में ऐसा करना चाहते हैं? यदि आप मैचों (या करीबी मैचों) के लिए खोज करना चाहते हैं तो यह कुछ ऐसा है जो डीबी अंत में सही ढंग से संभाला जाता है। कृपया हमें बताएं। – rdlowrey

+0

@rdlowery के रूप में कहता है, आप संभवतः MySQL की ज़िम्मेदारी पारित करने से बेहतर हैं - http://stackoverflow.com/questions/634995/implementation-of-levenshtein-distance-for-mysql-fuzzy-search और पढ़ने के लिए पढ़ें एक समाधान के लिए http://www.artfulsoftware.com/infotree/queries.php#552 ... – HorusKol

उत्तर

1

को मिला मुझे लगता है कि Soundex आप के लिए एक विकल्प है।

Lo Sauer के article कि

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

+0

यह स्वीकार्य उत्तर होना चाहिए, क्योंकि यह बेहतर प्रदर्शन करेगा क्योंकि MySQL पहले से ही डेटा को सीमित कर देगा, और संभवतः इसे अत्यधिक अनुक्रमित करेगा कुंआ। आप आसानी से और कुशलता से एक अलग कॉलम – twicejr

0

मैं PHP का उपयोग लगता है कि यह गलत तरीका है करने के लिए आपकी मदद कर सकता, MySQL आसानी से और कुशलता से कर सकते हैं। मुझे यकीन नहीं है कि आपकी पूरी स्कीमा संरचना कैसा है, लेकिन आप खोज पैरामीटर के साथ MySQL में PROCEDURE बना सकते हैं और इसे केवल PHP से कॉल कर सकते हैं।

  1. MySQL में यह करने के लिए कुछ इसी तरह बनाओ:

    - खोज पैरामीटर साथ proc बनाएं प्रक्रिया sp_SearchInterests बनाएँ (p_SearchParam VARCHAR में (30)); परिसीमक //

    हितों से चयन interest_desc कहां interest_desc = p_SearchParam या interest_desc की तरह '% pSearchParam%' //

    अंत; DELIMITER;

  2. वांछित परिणाम लौटने के लिए PHP से CALL sp_SearchInterests('whateveryouwant') पर।

+0

में SOUNDEX मान भी स्टोर कर सकते हैं? आम तौर पर "संग्रहित प्रक्रियाओं का उपयोग" का विरोध करता है। क्योंकि वे हैं .. MySQL में बस बुरा है। साथ ही, 9 0% मामलों में, अगर इरादा संग्रहीत कोड का उपयोग करना है - तो यह सोचने का समय है कि क्या कोड _application_ पर ले जाया जाना चाहिए। अंत में, ऊपर दिए गए कोड में लेवेनशेटिन दूरी –

+0

फेयर पॉइंट रे: लेवेनशेटिन दूरी के साथ कुछ लेना देना नहीं है। हालांकि ऊपर की प्रो सुपर फास्ट चलाएगी, अगर वह ऐसा करने की कोशिश कर रहा है, तो मुझे लगता है कि लेवेनशेटिन अधिक हो सकता है। – Phrancis

संबंधित मुद्दे