2009-12-07 9 views
1

Existe-t-il un moyen d'effectuer une recherche FULLTEXT qui renvoie les littéraux trouvés dans les mots?Recherche littérale dans un mot

J'utilise MATCH(col) AGAINST('+literal*' IN BOOLEAN MODE) mais il échoue si le texte est comme:

  • blah,blah,literal,blah
  • blahliteralblah
  • blah,blah,literal

S'il vous plaît noter qu'il n'y a pas d'espace après les virgules.

Je souhaite que les trois cas ci-dessus soient retournés.

+2

vous pouvez toujours faire comme « %% littérale » si la performance n'est pas un problème –

Répondre

2

Je pense que cela devrait être mieux aller chercher le tableau d'entrées et ensuite effectuer une manipulation de texte sur les données récupérées (dans ce cas, une recherche)! Comme toute manipulation de texte ou requête complexe prend plus de ressources et que votre base de données contient beaucoup de données, la requête devient trop lente! De plus, si vous exécutez votre requête sur un serveur partagé, cela augmente les problèmes de performances!

Vous pouvez facilement accomplir ce que vous essayez de faire avec regex, une fois que vous avez récupéré les données de la base de données!


MISE À JOUR: Ma suggestion est la même, même si vous exécutez votre script sur un serveur dédié! Cependant, si vous voulez effectuer une recherche en texte intégral du mot "littéral" dans BOOLEAN MODE comme vous l'avez décrit, vous pouvez supprimer l'opérateur + (car vous recherchez un seul mot) et construire la requête comme suit:

SELECT listOfColumsNames WHERE 
MATCH (colName) 
AGAINST ('literal*' IN BOOLEAN MODE); 

Cependant, même si vous ajoutez l'opérateur AND, votre requête fonctionne correctement: testé sur Apache Server avec MySQL 5.1!

Je vous suggère de lire the documentation sur la recherche en texte intégral en mode booléen.

Le seul problème de cette requête est qu'il ne correspond pas au mot "literal" s'il s'agit d'une sous-chaîne dans un autre mot, par exemple: "textliteraltext". Comme vous l'avez remarqué, vous ne pouvez pas utiliser l'opérateur * au début du mot!

Donc, pour accomplir ce que vous essayez de faire, le plus rapide et plus simple est de suivre la suggestion de Paul, en utilisant l'espace réservé %:

SELECT listOfColumsNames 
WHERE colName LIKE '%literal%'; 
+0

+1. Apache Lucene (Java), Zend Lucene (PHP), DotLucene (.Net) sont tous stables, puissants et populaires. – namespaceform

+0

Mais n'y a-t-il aucun moyen de le faire avec MATCH .. AGAINST? Je travaille sur un code avec un seul client et un serveur dédié - la seule contrainte est que le client obtienne les données le plus rapidement possible. Je veux dire que si le caractère générique * fonctionne pour les caractères suivant un littéral recherché, pourquoi n'y a-t-il pas d'implémentation rapide pour les caractères précédant un littéral recherché? –

Questions connexes