2009-09-09 8 views
4

J'essaie de rechercher une chaîne dans ma base de données, mais elle devrait être capable de faire correspondre n'importe quel mot et pas toute la phrase. Supposons que les données d'une table contiennent le texte a b c d e f g. Ensuite, si je cherche d c b il devrait être capable d'afficher les résultats.requête mySQL LIKE

field LIKE '%d c b%' ne fonctionne pas de cette manière. Est-ce que quelqu'un peut suggérer une façon plus robuste de chercher, en montrant éventuellement le compteur de pertinence?

Cela ne me dérange pas d'utiliser PHP aussi pour ce qui précède, mais je préfère faire la recherche au niveau DB.

Répondre

4

Pour de meilleurs résultats, vous devez créer l'index FULLTEXT sur vos données.

CREATE TABLE mytable (id INT NOT NULL, data TEXT NOT NULL, FULLTEXT KEY fx_mytable_data) ENGINE=MyISAM 

SELECT * 
FROM mytable 
WHERE MATCH(data) AGAINST ('+word1 +word2 +word3' IN BOOLEAN MODE) 

Notez que des mots index d'une lettre (comme dans votre exemple), vous aurez besoin de mettre ft_min_word_len à 1 dans MySQL confguration.

Cette syntaxe peut fonctionner même si vous n'avez pas d'index (tant que votre table est MyISAM), mais elle sera plutôt lente.

1

Si vous table est en MyISAM, vous pouvez utiliser la recherche FULLTEXT intégrée dans MySQL: 11.8. Full-Text Search Functions

Bien qu'il y aura des restrictions (par exemple, si je me souviens bien, vous ne pouvez pas rechercher le mot plus court que les caractères X - X étant généralement de 3 ou 4).


Une autre solution serait d'utiliser un moteur texte intégral, comme Lucene, Solr ou Sphinx - ceux qui font généralement un meilleur travail en matière de texte intégral, recherche: il est leur travail(travail de MySQL étant pour stocker des données, ne pas faire la recherche fulltext)

Il y a eu beaucoup de questions sur ceux sur SO; par exemple:


Si vous utilisez PHP et ne peut pas installer quoi que ce soit d'autre, il y a une implémentation PHP complète de Lucene: Zend_Search_Lucene

2

Je pense que vous veux faire est, pour l'une des lettres:

field LIKE '%d%' or field like '%c%' or field like '%b%' 

pour toutes les lettres

field LIKE '%d%' and field like '%c%' and field like '%b%' 
+0

Mais cela retournerait tout ce qui en a eu, plutôt que de retourner seulement ceux qui en ont tout ou partie. – nilamo

+0

ouais, mais cela ne semble pas être une exigence qu'il veut "correspondre à n'importe quel mot et pas toute la phrase." –

+0

-1 Cela renvoie également une chaîne telle que "** d ** hhlkjfyfjfjf ** c ** kjhtyfgv ** b **", auquel cas vous pouvez aussi bien dire "LIKE"% d% c% b% '. –

1

En fin de compte, les clauses MySQL LIKE ne sont pas destinées à être utilisées comme outils de recherche «puissants» pour faire une correspondance basée sur les mots. C'est un outil simple pour trouver des phrases partielles. Il n'est pas non plus connu pour sa mise à l'échelle, donc si vous le faites sur un site web haut de gamme, vous voudrez probablement une autre solution.

Alors que dit, il y a quelques options pour vous, pour obtenir ce que vous voulez:

  • soutien REGEX, il y a un soutien à MySQL pour faire REGEX based searches. En utilisant cela, et avec un REGEX assez compliqué, vous pouvez trouver ce que vous cherchez.

  • Indexation réelle en texte intégral dans MySQL. MySQL a un moyen de créer FULLTEXT indexes. Vous devez utiliser le moteur de données MyISAM et il existe des restrictions sur ce que vous pouvez ou ne pouvez pas faire exactement. Mais c'est beaucoup plus puissant que la fonctionnalité de base "comme" que SQL a. Je vous recommande de lire dessus si vous êtes intéressé.

  • Indexeurs tiers. C'est en fait la route que la plupart des gens vont. Ils utiliseront Lucene/Solr, ou d'autres technologies d'indexation similaires qui sont spécifiquement conçues pour effectuer une recherche en texte intégral de mots avec une logique différente, tout comme le fonctionnement des moteurs de recherche web modernes. Ils sont extrêmement efficaces parce qu'ils conservent leur propre base de données où ils cassent tout et les stockent d'une manière qui fonctionne le mieux pour ces types de recherches.

Espérons que l'une de ces trois options fonctionnera pour vous.

0

Lorsque vous utilisez la prise en charge de prendre clause like qu'il est %variable% ou variable% pas %variable.

Deuxièmement. pour faire une recherche affective utilisez la fonction explode pour casser les mots, comme si je recherche "apprendre php" il devrait rechercher comme ceci: "learn + php" comme dans Google. C'est la fonction explode().

+0

Cela ressemble plus à un commentaire qu'à une réponse. –