2009-01-02 21 views
8

मैं ऐसी साइट पर एक 'उन्नत खोज' पृष्ठ पर काम कर रहा हूं जहां आप 'मुझे पसंद है' जैसे कीवर्ड दर्ज करेंगे और यह निम्न विकल्पों का उपयोग कर डेटाबेस खोज सकता है:PHP/MySQL 'उन्नत खोज' पृष्ठ

खोजें:

: सभी शब्दों, सटीक वाक्यांश के साथ, शब्दों का कम से कम एक साथ शब्द

मैं द्वारा 'सटीक वाक्यांश' की देखभाल कर सकते हैं बिना, के साथ

SELECT * FROM myTable WHERE field='$keyword'; 

द्वारा 'कम से कम शब्दों में से एक':

SELECT * FROM myTable WHERE field LIKE '%$keyword%';//Let me know if this is the wrong approach 

लेकिन इसके और 'शब्दों का कम से कम एक साथ' है कि मैं पर अटक कर रहा हूँ 'शब्द के बिना'।

इन दोनों को कार्यान्वित करने के तरीके पर कोई सुझाव?

संपादित करें: के बारे में

(field='$keywords') OR ($field='$keywords) (OR).... 

जोड़ने के लिए 'कम से कम एक शब्द' एक अच्छा दृष्टिकोण विस्फोट() शब्द में कीवर्ड को तोड़ने के लिए एक पाश का उपयोग करने के लिए, और चलाने के लिए यह नहीं होगा क्योंकि वहाँ क्वेरी में कुछ अन्य और/या खंड भी हैं और मुझे अधिकतम क्लॉज के बारे में पता नहीं है।

उत्तर

12

मैं MySQL FullText Search का उपयोग Boolean Full-Text Searches कार्यक्षमता के साथ उपयोग करने का सुझाव दूंगा जो आपको वांछित परिणाम प्राप्त करने में सक्षम होना चाहिए।

संपादित करें:

अनुरोध आपके अनुरोध की स्थिति (उदाहरण के आधार पर "इसका सिर्फ एक क्षेत्र है और वे 4 विकल्पों में (यानी 1 शब्द, सटीक शब्दों, कम से कम 1 शब्द के दोनों चुन सकते हैं, अवधि के बिना)।")

मैं आपको अपने आरंभिक पोस्ट के आधार पर php का उपयोग कर रहे

<?php 
$choice = $_POST['choice']; 
$query = $_POST['query']; 

if ($choice == "oneWord") { 
    //Not 100% sure what you mean by one word but this is the simplest form 
    //This assumes $query = a single word 
    $result = mysql_query("SELECT * FROM table WHERE MATCH (field) AGAINST ('{$query}' IN BOOLEAN MODE)"); 
} elseif ($choice == "exactWords") { 
    $result = mysql_query("SELECT * FROM table WHERE MATCH (field) AGAINST ('\"{$query}\"' IN BOOLEAN MODE)"); 
} elseif ($choice == "atLeastOneWord") { 
    //The default with no operators if given multiple words will return rows that contains at least one of the words 
    $result = mysql_query("SELECT * FROM table WHERE MATCH (field) AGAINST ('{$query}' IN BOOLEAN MODE)"); 
} elseif ($choice == "withoutTheTerm") { 
    $result = mysql_query("SELECT * FROM table WHERE MATCH (field) AGAINST ('-{$query}' IN BOOLEAN MODE)"); 
} 
?> 

आशा है कि यह बूलियन मैचों में ऑपरेटरों का पूरा उपयोग के लिए मदद करता है यह सोचते हैं रहा हूँ देख Boolean Full-Text Searches

+0

+1, यह सबसे अच्छा जवाब है, लेकिन मैं भी विवरण है कि mysql पर fulltext केवल myisam तालिकाओं के लिए उपलब्ध है, न कि असंख्य लोगों के लिए। इसलिए आप लेनदेन की स्थिरता या खोज के बीच चयन करते हैं। –

+0

यदि आप कुछ स्रोत कोड देते हैं जो दिखाता है कि दो विशेषताएं (यानी सभी शब्द और शब्दों के बिना) कैसे किया जा सकता है पूर्ण पाठ के साथ मैं आपका जवाब स्वीकार कर सकता हूं। –

+0

मुझे आपको कुछ नमूना कोड प्रदान करने में प्रसन्नता होगी। अगर आप मुझे बता सकते हैं कि आपके खोज फ़ॉर्म में दो अलग-अलग फ़ील्ड हैं और बिना किसी के क्षेत्र के उपयोग कर रहे हैं? यदि यह है एक फ़ील्ड आप उपयोगकर्ता को उन शब्दों को जोड़ने की अनुमति दे सकते हैं जो एक - –

2

आप इस्तेमाल कर सकते हैं

शब्दों का कम से कम एक

SELECT * FROM myTable WHERE field LIKE '%$keyword%' 
or field LIKE '%$keyword2%' 
or field LIKE '%$keyword3%'; 

के साथ शब्द

SELECT * FROM myTable WHERE field NOT LIKE '%$keyword%'; 
+0

कृपया ऊपर मेरा संपादन देखें। क्या आपको लगता है कि यह एक अच्छा समाधान है, यानी क्या किसी प्रश्न में रखे जा सकने वाले या खंडों की संख्या के लिए कोई सीमा है? –

+0

शायद एक सीमा है, लेकिन मैंने कभी इसे हिट नहीं किया है और कथन कहां किया है, लेकिन जितना अधिक आप धीरे-धीरे जोड़ते हैं, उतना ही होगा और 'जैसे' विशेष रूप से धीमा होगा। – Re0sless

+0

कोई व्यावहारिक सीमा नहीं है। यदि आपके पास अन्य WHERE क्लॉज हैं तो अपनी कीवर्ड खोज को ब्रैकेट करें: "जहां कुछ = x और (फ़ील्ड जैसा ... या फ़ील्ड जैसा ... या ...) – Greg

2

बिना मैं आप आसानी से एक अनुभवहीन में उन लोगों के खोज विकल्पों कर सकता है यकीन नहीं है दूसरे दो के रूप में तरीके।

यदि आपको उन परिदृश्यों का समर्थन करने की आवश्यकता है तो बेहतर खोज इंजन को लागू करने के दौरान यह आपके लायक होगा। एक साधारण जो आपको संभवतः इन लाइनों के साथ प्राप्त कर सकता है:

जब कोई आइटम डेटाबेस में जोड़ा जाता है, तो यह अलग-अलग शब्दों में विभाजित होता है। इस बिंदु पर "सामान्य" शब्द (ए, ए, आदि ...) हटा दिए जाते हैं (शायद एक सामान्य_वर्ड्स तालिका के आधार पर)। शेष शब्द शब्द तालिका में जोड़े जाते हैं यदि वे पहले से मौजूद नहीं हैं। फिर शब्द प्रविष्टि और आइटम प्रविष्टि के बीच एक लिंक बनाया गया है।

खोज करते समय, यह शब्द तालिका से आईडी शब्द और जुड़ने वाली तालिका में आइटम आईडी के उपयुक्त लुकअप का मामला है।

1

खोजें बेहद मुश्किल है अच्छी तरह से करना ।

आप एक तृतीय पक्ष खोज Lucene या Sphider की तरह कुछ का उपयोग कर इंजन का उपयोग पर विचार करना चाहिए।

0

जिराफ और Re0sless 2 अच्छे जवाब pooseted।

नोट्स: "चयन *" बेकार है ... केवल आपको आवश्यक कॉलम का चयन करें। Re0sless कीवर्ड के बीच "OR" डालता है। - आपको सामान्य शब्दों को खत्म करना चाहिए ("", "i", "am", "और" .. आदि) - mysql में 8kb की क्वेरी के आकार पर विश्वास सीमा है, इसलिए वास्तव में लंबे चयन के लिए आपको स्लिप चाहिए यह अलग प्रश्नों में है। -

भी उपयोग करने के लिए "की तरह" की कोशिश (अगर मैं के लिए खोज का चयन करें मूल रूप से केवल "आप" एक बार के लिए खोज करनी चाहिए और "यह" के रूप में आम शब्दों elimnate "की तरह यह आप क्या आप जानते हैं") डुप्लीकेट कीवर्ड को खत्म करने की कोशिश और "MATCH LIKE" (MySQL मैन पेज देखें) यह "अस्पष्ट" खोजों के लिए चमत्कार कर सकता है

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