2009-07-14 6 views
24

MySQL'in FULLTEXT dizinlerini kullanarak PHP web uygulamam için arama desteği eklemeye çalışıyorum. MySQL FULLTEXT çalışmıyor

Ben (tek bir metin alanı a ile MyISAM türünü kullanarak,) bir test tablosu oluşturulan ve bazı örnek verileri girdi. Şimdi haklıysam, aşağıdaki sorgu her iki satırı da döndürmelidir:

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

Ancak hiçbiri geri dönmez. Biraz araştırma yaptım ve söyleyebildiğim kadarıyla her şeyi yapıyorum - tablo bir MyISAM tablosu, FULLTEXT indeksleri ayarlandı. Sorgu isteminden ve phpMyAdmin'den şanssız çalıştırarak denedim. Çok önemli bir şeyi mi özlüyorum?


GÜNCELLEME:

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 ; 

Ve veri kullanıyorum: Cody'nin çözüm benim test durumda çalışırken Tamam, benim gerçek tablo üzerinde çalışmak için görünmüyor

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'); 

Şimdi koşuyorum sorgusu:

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

Satır 3'ü döndürmeli, header_bg2.png. Bunun yerine boş bir sonuç kümesi daha elde ediyorum.

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) 

"başlığı" kelimesi uzunluğu kısıtlamalar dahilinde olduğunu ve bunu bir dur sözcüğü (Ben listesini almak için nasıl emin değilim) şüpheliyim: boolean arama için My seçenekleri aşağıda belirtilmiştir. Herhangi bir fikir? Doğal dil modu ve Boole modu:

+0

https://dev.mysql.com/doc/refman/5 burada şifreler listesini görebilirsiniz.5/en/fulltext-stopwords.html, innodb için http://dev.mysql.com/doc/refman/5.7/en/innodb-ft-default-stopword-table.html veya SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_DEFAULT_STOPWORD dosyasını çalıştırın; –

cevap

46

Sphinx fazla veri ekleme daha tam özellikli paketleri düşünebilirsiniz arama tam metin temeline dayanmaktadır olacak olursa. Varsayılan olarak MySQL, bir 'gürültü' kelimesi olabileceğini düşündüğünden, tablodaki satırların% 50'sinde veya daha fazlasında olan herhangi bir kelimeyi yok sayar.

Bir tabloda çok az satır ile

, genellikle bu% 50 sınırına ulaşmadan yaygındır (yani. Eğer iki satır varsa, her kelimeyi satırların en az% 50 olduğunu!).

+0

+1 .. bana cevap sormak için biraz zaman kurtardı –

+3

50 kuralı yok sayan boolean modunu (MySQL4.1 +) kullanmadığı sürece. – TheCarver

+0

+1 buradan da, açıklama için teşekkürler –

23

MySQL Fulltext arama için iki modu vardır. Doğal dil modunun bir kısıtlaması "... satırların% 50'sinde veya daha fazlasında mevcut olan sözcüklerin ortak kabul edildiği ve eşleşmediği. Tam metin aramaları, değiştirici belirtilmemişse doğal dil aramalarıdır." Ve doğal dil varsayılan moddur. Bu tam metin docs belgelenmiştir:

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

Eğer Boole modunu kullanarak sorgunuzu geçerseniz:

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

Sonra iki satır döndürülür.

Boole mod kendi kısıtlamaları, bu ilgi sırasına onun satırları döndürmek olmadığını olmanın ortak bir birine sahiptir. Genel olarak, doğal dil modundan daha fazla özellik ve esneklik sunar, bu yüzden muhtemelen onu kullanmayı sona erdirirsiniz.

Başvurunuz aşağıdaki gibi Lucene/Solr veya

+0

Teşekkürler,% 50 kural hakkında farkında değildim :) – Ross

+1

Bana sorarsan bu daha iyi bir cevap. – TheCarver