2011-03-04 11 views
9

मेरे पास "कुछ या अन्य" जैसे कीवर्ड हैं जहां हाइफ़ेंस मेरे mysql डेटाबेस के माध्यम से खोज में मायने रखता है। मैं वर्तमान में पूर्ण टेक्स्ट फ़ंक्शन का उपयोग कर रहा हूं।खोज क्वेरी में हाइफ़न के साथ पूर्ण टेक्स्ट खोज की अनुमति कैसे दें

क्या हाइफ़न चरित्र से बचने का कोई तरीका है? मुझे पता है कि एक विकल्प #define HYPHEN_IS_DELIMmyisam/ftdefs.h फ़ाइल में टिप्पणी करना है, लेकिन दुर्भाग्य से मेरा होस्ट इसकी अनुमति नहीं देता है। क्या वहां कोई दूसरा विकल्प है?

संपादित 3-8-11 कोड यह मैं अभी है: एक डैश या हाइफ़न के साथ एक शब्द खोजने के लिए

$search_input = $_GET['search_input']; 
$keyword_safe = mysql_real_escape_string($search_input); 
$keyword_safe_fix = "*'\"" . $keyword_safe . "\"'*"; 


$sql = " 
    SELECT *, 
     MATCH(coln1, coln2, coln3) AGAINST('$keyword_safe_fix') AS score 
     FROM table_name 
    WHERE MATCH(coln1, coln2, coln3) AGAINST('$keyword_safe_fix') 
    ORDER BY score DESC 
"; 

उत्तर

13

यहाँ से http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

एक समाधान पूर्ण पाठ का उपयोग करने के लिए है में बुलेन मोड में खोजें, और डबल कोट्स में हाइफ़न/डैश के साथ शब्द को संलग्न करें।

या यहां से http://bugs.mysql.com/bug.php?id=2095

एक और वैकल्पिक हल नहीं है। इसे हाल ही में मैनुअल में जोड़ा गया था: " एक वर्ण सेट फ़ाइल संशोधित करें: इसके लिए कोई पुनर्मूल्यांकन की आवश्यकता नहीं है। True_word_char() मैक्रो अन्य वर्णों से अक्षरों और संख्याओं को अलग करने के लिए" वर्ण प्रकार "तालिका का उपयोग करता है। आप संपादित कर सकते हैं वर्ण सेट एक्सएमएल फ़ाइलों में से एक में सामग्री निर्दिष्ट करने के लिए कि '-' एक है तो फिर दिया चरित्र अपने की प्रतिलिपि प्राप्त अनुक्रमित के लिए सेट का उपयोग "

अपने दम पर इसे करने की कोशिश नहीं की है" पत्र। "।।

संपादित करें:। यहाँ यहाँ से http://dev.mysql.com/doc/refman/5.0/en/fulltext-boolean.html

एक मुहावरा है कि दोहरे उद्धरण ("" ") वर्ण के भीतर संलग्न है कुछ और अतिरिक्त जानकारी केवल पंक्तियों वाक्यांश का शाब्दिक शामिल मेल खाता है, के रूप में यह लिखे गए वर्णों के पूर्ण है टेक्स्ट इंजन शब्दों में वाक्यांश को विभाजित करता है और शब्दों के लिए FULLTEXT अनुक्रमणिका में एक खोज करता है। MySQL 5.0.3 से पहले, इंजन ने तब रिकॉर्ड के वाक्यांश में वाक्यांश के लिए एक सबस्ट्रिंग खोज की, इसलिए मैच में नॉनवर्ड वर्ण शामिल होना चाहिए वाक्यांश में। MySQL 5.0.3 के रूप में, गैर-वर्णित वर्णों को बिल्कुल मेल नहीं किया जाना चाहिए: वाक्यांश खोज की आवश्यकता होती है केवल उन मैचों में वाक्यांश के समान शब्द और उसी क्रम में होते हैं। उदाहरण के लिए, "परीक्षण वाक्यांश" मिलान "परीक्षण, वाक्यांश "MySQL 5.0.3 में, लेकिन नहीं सामने।

यदि वाक्यांश में इंडेक्स में कोई शब्द नहीं है, तो परिणाम खाली है। उदाहरण के लिए, यदि सभी शब्द या तो अनुक्रमित शब्दों की न्यूनतम लंबाई से कम या कम हैं, तो परिणाम खाली है।

+0

मैंने वास्तव में आपके द्वारा उल्लेखित पहले समाधान को देखा। हालांकि मैं इसे दोहराने में असमर्थ था। क्या आप मुझे ऐसी क्वेरी का उदाहरण दे सकते हैं? – Jay

+2

निश्चित रूप से, उस चुनें * अपने_table_name से जहां MATCH (your_table_column_name) फिर से ('' SQL-MySQL "'बूलेन मोड में); मूर जानकारी के लिए यहां देखें http://dev.mysql.com/doc/refman/5.5/en/fulltext-boolean.html –

+0

फ़ैंटस्टिक !! एक जादू की तरह काम किया! बहुत बहुत धन्यवाद :) – Jay

3

Binary ऑपरेटर का उपयोग करने के लिए शायद आसान हो सकता है।

SELECT * 
FROM your_table_name 
WHERE BINARY your_column = BINARY "Foo-Bar%AFK+LOL" 

http://dev.mysql.com/doc/refman/5.0/en/cast-functions.html#operator_binary

BINARY ऑपरेटर स्ट्रिंग एक द्विआधारी स्ट्रिंग के लिए यह निम्नलिखित डाले। चरित्र द्वारा चरित्र के बजाए बाइट द्वारा बाइट द्वारा किए जाने वाले कॉलम तुलना को बल देने के लिए यह एक आसान तरीका है। इससे तुलनात्मक रूप से केस संवेदनशील होती है, भले ही कॉलम को BINARY या BLOB के रूप में परिभाषित नहीं किया गया हो। BINARY पीछे की जगहों को महत्वपूर्ण होने का भी कारण बनता है।

+1

इससे मेरा MySQL वर्कबेंच मेरे लिए क्रैश हो गया। – mnutsch

2

कुछ लोगों को निम्न क्वेरी का उपयोग करने के लिए सुझाव है:

SELECT id 
FROM texts 
WHERE MATCH(text) AGAINST('well-known' IN BOOLEAN MODE) 
HAVING text LIKE '%well-known%'; 

लेकिन उस से आप इस्तेमाल की प्रतिलिपि प्राप्त ऑपरेटरों के आधार पर कई वेरिएंट की जरूरत है। कार्य: +well-known +(>35-hour <39-hour) working week* जैसी क्वेरी को समझें। बहुत जटिल!

और ft_min_word_len के डिफ़ॉल्ट लेन को न भूलें, इसलिए up-to-date की खोज आपके परिणामों में केवल date लौटाती है। इसके बजाय अपने डेटाबेस तालिका के लिए निम्न पाठ जोड़ने के

  1. :

    चाल

    इस कारण से

    मैं तो साथ HAVING आदि निर्माण बिल्कुल आवश्यक नहीं हैं एक चाल पसंद करते हैं

    "The Up-to-Date Sorcerer" is a well-known science fiction short story.
    प्रतिलिपि बिना किसी टिप्पणी के पाठ के अंत तक हाइफ़न शब्द:
    "The Up-to-Date Sorcerer" is a well-known science fiction short story.<!-- UptoDate wellknown -->

  2. यदि उपयोगकर्ताकी खोज करते हैंएसक्यूएल क्वेरी में हाइफन निकालें:
    MATCH(text) AGAINST('uptodate ' IN BOOLEAN MODE)

कि करके आप उपयोगकर्ता के बजाय वे सारे परिणाम होते हैं केवल date (क्योंकि ft_min_word_lenup और to मारता है) होने का up-to-date एक के रूप में शब्द प्राप्त कर सकते हैं कर रहे हैं।

इससे पहले कि आप echo ग्रंथों से पहले आपको <!-- ... --> टिप्पणियां हटा दें।

लाभ

  • क्वेरी सरल
  • उपयोगकर्ता के रूप में हमेशा की तरह
  • सभी की प्रतिलिपि प्राप्त ऑपरेटरों का उपयोग करने के लिए तेजी से क्वेरी है सक्षम है।
  • यदि कोई उपयोगकर्ता -well-known +science के लिए खोज करता है MySQL व्यवहार करता है कि not include *well*, could include *known* and must include *science* है। यह उपयोगकर्ता की अपेक्षा नहीं है। चाल को हल करती है के लिए से हाइफन को निकाल कर उसे भी (के रूप में एसक्यूएल क्वेरी -wellknown +science की खोज करता है)
0

यह बंद ध्वनि सकता है, लेकिन थोड़ी देर के लिए इस के साथ संघर्ष कर के बाद, मुझे एहसास हुआ कि मैं परिणाम मैं चाहता हूँ मिल खोज अभिव्यक्ति उदाहरण के लिए, यदि मैं 'शब्द से अलग'

SELECT * FROM table WHERE MATCH(column) AGAINST ('word separated'); 

आवश्यकतानुसार 'शब्द-पृथक' के उदाहरण देता है। यह अन्य अलग और शब्द के उदाहरण भी लौटाता है, लेकिन प्रत्येक शब्द में + ऑपरेटर जोड़ना हाइफ़न खोज प्राप्त करता है।

SELECT * FROM table WHERE MATCH(column) AGAINST ('+word +separated');