FULLTEXT MySQL ne fonctionne pas
Je suis d'essayer d'ajouter de la recherche de soutien pour mon PHP web app à l'aide de MySQL FULLTEXT index.
J'ai créé une table de test (à l'aide de la MyISAM type, avec un seul champ de texte a
) et entré les données de l'échantillon. Maintenant, si je suis à droite de la requête suivante renvoie les deux ces lignes:
SELECT * FROM test WHERE MATCH(a) AGAINST('databases')
Toutefois il renvoie none. J'ai fait un peu de recherche et je suis en train de faire tout ce que je peut dire - la table est une table MyISAM, la FULLTEXT index. J'ai essayé de l'exécution de la requête à partir de l'invite de commandes et de phpMyAdmin, avec pas de chance. Ai-je raté quelque chose d'essentiel?
Mise à JOUR: Ok, alors que Cody solution a fonctionné dans mon cas de test, il ne semble pas fonctionner sur mon tableau:
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 ;
Et les données que j'utilise:
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');
La requête, je suis maintenant en cours d'exécution est:
SELECT * FROM `uploads` WHERE MATCH(name) AGAINST ('header' IN BOOLEAN MODE)
Qui devrait revenir la ligne 3, header_bg2.png. Au lieu de cela, je reçois un autre jeu de résultats vide. Mes options pour la recherche booléenne sont ci-dessous:
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)
"en-tête" est à l'intérieur de la longueur de mot de restrictions et je doute que c'est un mot vide (je ne suis pas sûr de la façon d'obtenir la liste). Des idées?
- Vous pouvez voir ici la liste de mots vides dev.mysql.com/doc/refman/5.5/en/fulltext-stopwords.html, pour innodb dev.mysql.com/doc/refman/5.7/en/... ou d'exécuter SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_DEFAULT_STOPWORD;
Vous devez vous connecter pour publier un commentaire.
Ajouter plus de données. Par défaut, MySQL va ignorer un mot qui est dans 50% ou plus de lignes dans la table, car il estime qu'il serait un "bruit" de word.
Avec très peu de lignes dans une table, il est commun pour atteindre cette limite de 50% souvent (ie. si vous avez deux lignes, chaque mot est à au moins 50% de la lignes!).
Il existe deux modes pour Fulltext MySQL de recherche: le langage naturel mode et de la mode Booléen. Une restriction de la langue naturelle mode " ... les mots qui sont présents dans 50% ou plus des lignes sont considérées comme communes et ne correspondent pas. Des recherches de texte intégral sont en langage naturel recherches si aucun modificateur n'est donné." Et le langage naturel est le mode par défaut. Ceci est documenté dans le Fulltext docs:
http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html
Si vous passez votre requête à l'aide de mode Booléen:
Puis les deux lignes sont retournées.
Boolean mode a ses propres restrictions, l'un commun étant qu'elle ne retourne pas ses rangées par ordre de pertinence. Dans l'ensemble, il offre plus de fonctionnalités et de flexibilité que le langage naturel mode, de sorte que vous aurez probablement jusqu'à la fin de l'utiliser.
Si votre application va s'appuient fortement sur la recherche en texte intégral, vous pourriez envisager plus complet des logiciels tels que Lucene/Solr ou Sphinx