2016-01-15 4 views
8

मैंने कुछ articles और issues पढ़ा है, लेकिन एक संतोषजनक समाधान नहीं मिला। जब उपयोगकर्ता किसी फॉर्म में भरता है तो मैं डेटाबेस से संबंधित रिकॉर्ड चुनना चाहता हूं; वैसे ही जब आप एक प्रश्न पूछते हैं तो कार्यक्षमता इस साइट पर काम करती है।शब्द सीमाओं के साथ MySQL पूर्ण टेक्स्ट खोज

स्तंभ subject

+---+---------------------------------------------------+ 
| 1 | Pagina aanmaken en beter doorzoekbaar maken  | 
+---+---------------------------------------------------+ 
| 2 | Sorteerfunctie uitbreiden in zoek-en-boek functie | 
+---+---------------------------------------------------+ 
| 3 | Zoek de verschillen tussen de pagina's   | 
+---+---------------------------------------------------+ 

में निम्नलिखित तीन रिकॉर्ड के साथ एक डेटाबेस तालिका पर विचार करें मैं शब्द zoek साथ अपनी खोज क्वेरी शुरू तो मैं अवधि zoek पर डेटाबेस से सबसे अधिक प्रासंगिक परिणाम क्वेरी करना चाहते हैं।

SELECT 
    id, 
    subject, 
    MATCH(
     subject 
    ) 
    AGAINST(
     'zoek*' 
     IN BOOLEAN MODE 
    ) 
    AS 
     score 
FROM 
    Issues 
WHERE 
    MATCH(
     subject 
    ) 
    AGAINST(
     'zoek*' 
     IN BOOLEAN MODE 
    ) 

जब मैं इस क्वेरी मैं सभी रिकॉर्ड दिखाने के लिए और करने के लिए उम्मीद थी चलाने (शायद, मैं नहीं जानता कि कैसे विशिष्टता MySQL में काम करता है) आईडी 3 शीर्ष पर प्रदर्शित करने के लिए: मैं निम्न क्वेरी के साथ आया था (क्योंकि सटीक शब्द मिलान)।

इसके बजाय क्वेरी के परिणाम केवल उसी स्कोर (0.031008131802082062) के साथ पंक्ति 2 और 3 थे।

उचित रिकॉर्ड से मेल खाने के लिए मुझे अपनी क्वेरी में बदलने की क्या ज़रूरत है? यह भी मानते हैं कि उपयोगकर्ता कीवर्ड या वाक्यों में टाइप कर सकते हैं।

+0

तुम क्यों परिणाम में सभी रिकॉर्ड को देखने के लिए उम्मीद की थी? 1-सेंट रिकॉर्ड में शब्द 'ज़ोके' –

+0

@ आर-कोस्टा का उत्तर नीचे सही नहीं है। साथ ही, आप http://dev.mysql.com/doc/refman/5.7/en/fulltext-boolean.html पर "प्रासंगिकता रैंकिंग की गणना कैसे की जाती है" पर देखना चाह सकते हैं। MySQL ऐसा कर रहा है जो इसे यहां करना है। यदि आपको अधिक पूरी तरह से फीचर्ड टेक्स्ट खोज की आवश्यकता है, तो आपको शायद लुसीन आधारित (सोलर, लोचदार खोज, आदि) का उपयोग करने की आवश्यकता है। – evanv

उत्तर

0

अपने मामले के लिए एक workaound है:

SELECT 
    id, 
    subject, 
    IF (subject LIKE "zoek %" OR subject LIKE "% zoek %" OR subject LIKE "% zoek", 
     1, 
     IF (subject LIKE "% zoek%", 
      0.5, 
      IF (subject LIKE "%zoek%", 
       0.2, 
       0) 
      ) 
     ) as score 
FROM 
    Issues 
WHERE subject LIKE "%zoek%" 
ORDER by score DESC 

अपेक्षित परिणाम:

+---+---------------------------------------------------+------+ 
|id | subject           |score |  
+---+---------------------------------------------------+------+ 
|3 | Zoek de verschillen tussen de pagina's   | 1 | 
+---+---------------------------------------------------+------+ 
|2 | Sorteerfunctie uitbreiden in zoek-en-boek functie | 0.5 | 
+---+---------------------------------------------------+------+ 
|1 | Pagina aanmaken en beter doorzoekbaar maken  | 0.2 | 
+---+---------------------------------------------------+------+ 
+0

यह वही काम करता है जैसे मैं चाहता हूं कि जब मैं एक शब्द खोजूं। एक पक्ष की समस्या यह है कि मैं कई शब्दों को खोजना चाहता हूं। यदि मैं खोज शब्द को 'de zoek'' में बदलता हूं उदाहरण के लिए मुझे कोई रिकॉर्ड नहीं मिलता है। लेकिन अब तक इस दृष्टिकोण के लिए धन्यवाद! – Maurice

2

MySQL पूर्ण-पाठ खोज प्रत्यय का समर्थन नहीं करती है।

पहली पंक्ति पाने के लिए आपको '* zoek *' के खिलाफ एक मैच करना होगा, जिसे वर्तमान में अनुमति नहीं है।

विकल्प, शब्द का

SELECT id, subject 
FROM Issues 
WHERE subject LIKE '%zoek%' 
0

क्षमा करें ...

मध्य (doorzoekbaar) है उपयोग करने के लिए MySQL के FULLTEXT, नहीं कुछ की परिभाषा है कि मिल जाएगा कर रहा है। FULLTEXT में "कंपाउंड संज्ञाएं" की कोई अवधारणा नहीं है, इसलिए यह शब्द को अलग करने का प्रयास नहीं करेगा।

FULLTEXT में "शब्द" की परिभाषा 'डैश' और 'स्पेस' को वही अर्थ देती है - अर्थात् एक शब्द सीमा। तो, zoek de... और zoek-... बराबर वजन दिया जाता है।

सोलर, लुसीन और अन्य तृतीय पक्ष "फुलटेक्स्ट समाधान" देखें। वे जो चाहते हैं उसे प्रदान कर सकते हैं (या नहीं)।

zoek* और +zoek*, जब IN BOOLEAN MODE के साथ चलाने के zoekbaar मिल जाएगा।

1

अलग परिणाम के लिए इस प्रश्न आजमाएँ:

  1. सभी विषय है कि पत्र के साथ "Z" शुरू होता है का चयन करें:
    SELECT ID, Subject FROM table_name WHERE Subject LIKE 'z%';

  2. सभी विषय है कि पत्र "Z" के साथ समाप्त होता चयन करें:
    SELECT ID, Subject FROM table_name WHERE Subject LIKE '%z';

  3. पैटर्न "ज़ोइक" युक्त सभी विषय का चयन करें:
    SELECT ID, Subject FROM table_name WHERE Subject LIKE '%zoek%';

1

दूसरों के रूप में की सलाह दी, MySQL के FULLTEXT अनुक्रमित प्रमुख वाइल्डकार्ड का समर्थन नहीं करते हैं, और इसलिए प्रत्यय के लिए खोज में मदद नहीं कर सकता।

हालांकि, नए ngram Full-Text Parser मदद कर सकता है:

निर्मित MySQL पूर्ण पाठ पार्सर निर्धारित करने के लिए जहां शब्द शुरू और समाप्त है, जो एक सीमा है जब काम कर परिसीमक के रूप में शब्दों के बीच सफेद स्थान का उपयोग करता है वैचारिक भाषाओं के साथ जो शब्द delimiters का उपयोग नहीं करते हैं। इस सीमा को हल करने के लिए, MySQL एक ngram पूर्ण-पाठ पार्सर (...) प्रदान करता है।

एक ngram पाठ के दिए गए अनुक्रम से एन वर्णों का एक संगत अनुक्रम है। Ngram पार्सर एन अक्षरों के एक संगत अनुक्रम में पाठ के अनुक्रम को टोकन करता है।

जैसा कि मैंने कभी भी इस सुविधा का उपयोग नहीं किया है, मैं इस विषय पर और मदद नहीं कर सकता। हालांकि नोटिस: एक ngram FULLTEXT सूचकांक केवल शामिल ngrams, और शर्तों की शुरुआत के बारे में जानकारी नहीं है

वजह से, वाइल्डकार्ड खोजों अप्रत्याशित परिणाम वापस आ सकते हैं।

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