Php/ MySql "Recherche Avancée", Page
Je suis en train de travailler sur une "recherche avancée" à la page sur un site où vous devez entrer un mot clé tel que "j'aime les pommes" et il peut rechercher dans la base de données en utilisant l'une des options suivantes:
Trouver : Avec tous les mots, Avec les
la phrase exacte , Avec au moins l'un des
les mots, Sans les mots
Je peux prendre soin de la "phrase Exacte" par:
SELECT * FROM myTable WHERE field='$keyword';
'Au moins un des mots" par:
SELECT * FROM myTable WHERE field LIKE '%$keyword%';//Let me know if this is the wrong approach
Mais son "au moins un des mots" et "Sans les mots" que je suis coincé sur.
Des suggestions sur la façon de mettre en œuvre ces deux?
Edit: Concernant le "Au moins un mot:" il ne serait pas une bonne approche pour utiliser explode() pour briser les mots-clés en mots, et d'exécuter une boucle pour ajouter
(field='$keywords') OR ($field='$keywords) (OR)....
Car il y a quelques autres ET/OU des clauses de la requête aussi et je ne suis pas au courant du nombre maximum de clauses peut y avoir.
OriginalL'auteur Click Upvote | 2009-01-02
Vous devez vous connecter pour publier un commentaire.
Je suggère l'utilisation de Recherche FullText MySQL à l'aide de ce avec la Boolean Des Recherches De Texte Intégral fonctionnalités que vous devez être en mesure d'obtenir le résultat souhaité.
Edit:
Demandée exemple basé sur votre demande conditions ("c'est juste un champ et qu'ils peuvent choisir l'une des 4 options (j'.e 1 mot, les mots exacts, au moins 1 mot, sans que le terme).")
Je suis en supposant que vous utilisez php en fonction de votre post initial
espérons que cela vous aide pour la pleine utilisation des opérateurs booléens matches de voir Boolean Des Recherches De Texte Intégral
Si vous donnez du code source qui montre comment les deux caractéristiques (j'.e tous les mots et sans les paroles) peut être fait avec Plein de texte, je pourrais accepter votre réponse.
Je serais heureux de vous fournir des exemples de code. Si vous pouvez me dire, il y a deux champs distincts dans votre formulaire de recherche pour avec et sans ou utilisez-vous un terrain? Si c'est un champ, vous pouvez tout simplement permettre à l'utilisateur d'ajouter les mots le souhaitez exclure avec un -.
C'est juste l'un champ et qu'ils peuvent choisir l'une des 4 options (j'.e 1 mot, les mots exacts, au moins 1 mot, sans que le terme).
Ok je vais poster quelques exemple de code basé sur chaque peu de temps.
OriginalL'auteur Mark Davidson
Vous pouvez utiliser
Avec au moins l'un des mots
Sans le mot
Il n'y a probablement une limite, mais je n'ai jamais frappé et l'ont fait beaucoup plus longue lorsque des déclarations, mais le plus vous ajoutez le ralentissement de la requête et
like
est particulièrement lent.Il n'y a pas de limite pratique. Si vous avez d'autres OÙ l'une des clauses puis support de votre mot-clé de recherche: "OÙ quelque chose = x ET (domaine de la ... OU d'un champ COMME ... OU ...)
OriginalL'auteur Re0sless
Je ne suis pas sûr que vous pourriez facilement faire ces options de recherche dans un naïf manière que les deux autres.
Il serait utile de votre temps la mise en œuvre d'un meilleur moteur de recherche si vous avez besoin à l'appui de ces scénarios. Simple qui pourrait probablement obtenir par est quelque chose le long de ces lignes:
Lorsqu'un élément est ajouté à la base de données, il est divisé en les mots individuels. À ce point "commun" des mots (le, la, un, etc...) sont supprimés (probablement basé sur une common_words tableau). Les mots suivants sont ajoutés à un des mots de la table si ils ne sont pas déjà présents. Il y a alors un lien entre le mot et le point d'entrée.
Lors de la recherche, il est alors un cas d'obtenir le mot id de la table word et la recherche de l'élément d'id dans l'assemblage de la table.
OriginalL'auteur Giraffe
De recherche est notoirement difficile de bien faire.
Vous devriez Envisager d'utiliser un tiers de moteur de recherche en utilisant quelque chose comme Lucene ou Sphider.
OriginalL'auteur seanyboy
Girafe et Re0sless pooseted 2 bonnes réponses.
notes:
"SELECT *" suce... de sélectionner uniquement les colonnes dont vous avez besoin.
Re0sless met un "OU" entre les mots clés.
- vous devez éliminer les mots communs (" ","i","suis","et", etc...)
- mysql a un 8ko je trouve limite sur la taille de la requête, donc pour vraiment longue SÉLECTIONNE que vous devriez divisé en requêtes distinctes.
- essayez d'éviter les doubles mots-clés (si je recherche pour "vous savez que vous l'aimez" le doit essentiellement de la recherche pour "vous" une fois et elimnate des mots courants comme "il")
Également essayer d'utiliser le "LIKE" et "MATCH COMME" (voir mysql page de man), il peut faire des merveilles pour le "flou" des recherches
OriginalL'auteur Quamis