2009-07-14 13 views
24

मैं MySQL की FULLTEXT अनुक्रमणिका का उपयोग करके अपने PHP वेब ऐप के लिए खोज समर्थन जोड़ने का प्रयास कर रहा हूं।MySQL FULLTEXT काम नहीं कर रहा

मैंने एक टेस्ट टेबल बनाया (MyISAM प्रकार का उपयोग करके, एक टेक्स्ट फ़ील्ड a के साथ) और कुछ नमूना डेटा दर्ज किया। हालांकि यह कोई भी रिटर्न

SELECT * FROM test WHERE MATCH(a) AGAINST('databases') 

: अब अगर मैं कर रहा हूँ सही निम्न क्वेरी दोनों उन पंक्तियों को वापस करना चाहिए। मैंने थोड़ा सा शोध किया है और जहां तक ​​मैं कह सकता हूं, मैं सब कुछ ठीक कर रहा हूं - तालिका एक माईसाम तालिका है, FULLTEXT अनुक्रमणिका सेट हैं। मैंने प्रॉम्प्ट से और phpMyAdmin से कोई भाग्य के साथ क्वेरी चलाने का प्रयास किया है। क्या मुझे कुछ महत्वपूर्ण याद आ रही है?


अद्यतन: ठीक है, जबकि कोड़ी के समाधान अपने परीक्षण के मामले में काम किया यह मेरा वास्तविक मेज पर काम करने के लिए प्रतीत होता है नहीं:

CREATE TABLE IF NOT EXISTS `uploads` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` text NOT NULL, 
    `size` int(11) NOT NULL, 
    `type` text NOT NULL, 
    `alias` text NOT NULL, 
    `md5sum` text NOT NULL, 
    `uploaded` datetime NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ; 

और डेटा मैं उपयोग कर रहा हूँ:

INSERT INTO `uploads` (`id`, `name`, `size`, `type`, `alias`, `md5sum`, `uploaded`) VALUES 
(1, '04 Sickman.mp3', 5261182, 'audio/mp3', '1', 'df2eb6a360fbfa8e0c9893aadc2289de', '2009-07-14 16:08:02'), 
(2, '07 Dirt.mp3', 5056435, 'audio/mp3', '2', 'edcb873a75c94b5d0368681e4bd9ca41', '2009-07-14 16:08:08'), 
(3, 'header_bg2.png', 16765, 'image/png', '3', '5bc5cb5c45c7fa329dc881a8476a2af6', '2009-07-14 16:08:30'), 
(4, 'page_top_right2.png', 5299, 'image/png', '4', '53ea39f826b7c7aeba11060c0d8f4e81', '2009-07-14 16:08:37'), 
(5, 'todo.txt', 392, 'text/plain', '5', '7ee46db77d1b98b145c9a95444d8dc67', '2009-07-14 16:08:46'); 

क्वेरी मैं अब चल रहा हूँ है:

SELECT * FROM `uploads` WHERE MATCH(name) AGAINST ('header' IN BOOLEAN MODE) 

जो पंक्ति 3, header_bg2.png वापस करना चाहिए। इसके बजाय मुझे एक और खाली परिणाम सेट मिलता है। बूलियन खोज के लिए मेरे विकल्प में नीचे हैं:

mysql> show variables like 'ft_%'; 
+--------------------------+----------------+ 
| Variable_name   | Value   | 
+--------------------------+----------------+ 
| ft_boolean_syntax  | + -><()~*:""&| | 
| ft_max_word_len   | 84    | 
| ft_min_word_len   | 4    | 
| ft_query_expansion_limit | 20    | 
| ft_stopword_file   | (built-in)  | 
+--------------------------+----------------+ 
5 rows in set (0.02 sec) 

"शीर्षक" शब्द लंबाई प्रतिबंध के भीतर है और मुझे शक है वह काम करना बंद शब्द (मुझे यकीन है कि कैसे सूची प्राप्त करने नहीं कर रहा हूँ) है। कोई विचार?

+0

आप यहां https://dev.mysql.com/doc/refman/5 स्टॉपवर्ड सूची देख सकते हैं।5/en/fulltext-stopwords.html, innodb http://dev.mysql.com/doc/refman/5.7/en/innodb-ft-default-stopword-table.html के लिए या INFORMATION_SCHEMA.INNODB_FT_DEFAULT_STOPWORD से चुनें * चलाएं; –

उत्तर

46

अधिक डेटा जोड़ चाहते हो सकता है की प्रतिलिपि प्राप्त पर काफी भरोसा करने के लिए जा रहा है। डिफ़ॉल्ट रूप से MySQL किसी भी शब्द को अनदेखा कर देगा जो तालिका में 50% या अधिक पंक्तियों में है क्योंकि यह मानता है कि यह 'शोर' शब्द होगा।

तालिका में बहुत कम पंक्तियों के साथ, यह 50% सीमा को अक्सर मारना आम है (यानी यदि आपके पास दो पंक्तियां हैं, तो प्रत्येक शब्द पंक्तियों में से कम से कम 50% में है!)।

+0

+1 .. मुझे जवाब देने के लिए कुछ समय बचाया –

+3

जब तक वह बूलियन मोड (MySQL4.1 +) का उपयोग नहीं करता है जो 50 नियम को अनदेखा करता है। यहां से – TheCarver

+0

+1, स्पष्टीकरण के लिए धन्यवाद –

23

MySQL फुलटेक्स्ट खोज के लिए दो तरीके हैं: प्राकृतिक भाषा मोड और बूलियन मोड। प्राकृतिक भाषा मोड का एक प्रतिबंध "... शब्द जो 50% या अधिक पंक्तियों में मौजूद हैं, आम हैं और मेल नहीं खाते हैं। अगर कोई संशोधक नहीं दिया जाता है तो पूर्ण-पाठ खोज प्राकृतिक भाषा खोज होती हैं।" और प्राकृतिक भाषा डिफ़ॉल्ट मोड है। यह फुलटेक्स्ट डॉक्स में दर्ज है:

http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

आप बूलियन मोड का उपयोग करने के लिए आपकी क्वेरी स्विच करते हैं:

SELECT * FROM test WHERE MATCH(a) AGAINST('databases' IN BOOLEAN MODE) 

फिर दो पंक्तियों लौटाए जाते हैं।

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

आपके आवेदन खोज आप और अधिक पूर्ण विशेषताओं पैकेज पर विचार करने के इस तरह के रूप Lucene/Solr या Sphinx

+0

धन्यवाद, मुझे 50% नियम के बारे में एहसास नहीं हुआ :) – Ross

+1

यदि आप मुझसे पूछें तो यह एक बेहतर जवाब है। – TheCarver

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