IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Symfony2 et recherche full-text [2.x]


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 81
    Par défaut Symfony2 et recherche full-text
    Bonjour à tous,

    Je développe un projet de comparateur de prix avec symfony2 et j'aimerai pouvoir faire des recherche "full-text" dans mon entité Doctrine 2 qui correspond à mon catalogue de produit.

    Malheureusement j'ai vu dans la doc MySql que pour faire des requêtes avec MATCH et AGAINST je dois avoir une table MyISAM et non une Table de type InnoDB comme m'a créée doctrine avec la commande php app/console doctrine:schema:create.

    Donc 2 choses :

    Soit je dois changer dans la configuration de Doctrine 2 le fait de générer des Tables Myisam mais je ne sais pas ou c'est ?

    Soit je fais fausse route et il y a moyen avec Doctrine2 de faire le même type de recherche avec une fonction que je ne connais pas ? Il y a très peu de résultat sur le web à ce sujet... et la doc doctrine2 est assez difficile à comprendre...

    Si qqn peut m'aiguiller mieux ça serait sympa !

    Merci à tous !

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 14
    Par défaut
    Bonjour,

    Je me suis penché sur cette question cette semaine !

    Doctrine ne sait pas travailler avec des tables MyISAM, et il est impossible de créer des indexes fulltext sur une base InnoDB... sauf avec InnoDB FTS !

    Pour le moment, la seule façon que j'ai trouvé pour installer ça, c'est d'installer MySQL 5.6 (version en développement).

    Tu pourras ensuite créer UN index fulltext sur tes tables innoDB, contenant tous les champs qui doivent servir à te recherche.

    Seul gros inconvénient, pour faire un update sur une entité de ta table, il faut impérativement mettre à jour au moins l'un des champs fulltext, sans quoi tu te retrouves avec une erreur #180 InnoDB FTS Doc ID.

    J'ai pas bien compris d'où ça venait (et la doc est pas facile à trouver pour un truc pas sorti...).

    J'ai développé une extension qui permet d'effectuer une recherche fulltext sur avec doctrine : https://gist.github.com/1234419

    La requête qui va avec doit ressembler à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        public function search($address) {
            return $this->createQueryBuilder('p')
                ->addSelect('MATCH_AGAINST (p.name, p.country, p.street, p.postal, p.city, p.state, :address) as score')
                ->add('where', 'MATCH_AGAINST(p.name, p.country, p.street, p.postal, p.city, p.state, :address) > 0.8')
                ->setParameter('address', $address)
                ->orderBy('score', 'desc')
                ->setMaxResults(5)
                ->getQuery()
                ->getResult();
        }
    J'ai ajouté sur mon gist la fonction en ligne de commande que j'ai développé pour re-créer les liens fulltext (sans quoi doctrine 2 les vire à chaque update il me semble).

    Autrement, pour faire de la recherche dans une base de données, il y a Zend Lucene, que je n'ai jamais utilisé. Mais je ne pense pas qu'il puisse être plus rapide qu'une recherche fulltext !

    Espérons que MySQL 5.6 sorte en version stable rapidement !

    Bonne continuation !

    EDIT : Un début de réponse sur cette page pour le problème de DOC ID : http://blogs.innodb.com/wp/2011/07/o...th-innodb-fts/

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 81
    Par défaut
    Merci de ta réponse !

    Je viens de regarder ce que tu m'as dit mais le principal problème c'est que le site doit être en production d'ici 1 semaine et je ne pense pas que mysql sortira une version stable de la 5.6 d'ici la...

    Autre chose, en regardant l'ensemble des doc sur les tables Myisam et Innobd, je me suis rendu compte que dans la philosophie, Myisam est vraiment plus adapté à ce dont j'ai besoin...

    J'ai une table de plus de 150 000 entrés de produits et je ne fais que de la lecture a travers mon moteur de recherche (jamais de UPDATE car la base est effacée puis recréée tous les jours avec un cron)

    Je vais être obligé d'allez voir du coté Zend Lucene (j'ai trouve plusieurs Bundle Symfony2 qui permettent de l'utiliser...) en attendant que mysql nous sorte une version 5.6 !

    Je ne vois pas d'autres solutions...

  4. #4
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 772
    Par défaut
    Tu peux aussi bypasser Doctrine et faire à ta manière (mais vu la deadline je crains que ça ne revienne à réécrire de grosses portions du code, ce pour quoi tu n'auras pas le temps, surtout si tu veux que ça fonctionne ).
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 81
    Par défaut
    C'est une solution à laquelle j'ai pensé... Surtout que ma table ce n'est pas Doctrine qui me l'a rempli tous les jours, mais un script php avec PDO que j'ai créée à la main (pour parser les fichiers XML catalogue de mes affiliations, c'était plus simple d'avoir un fichier php simple à lancer en ligne de commande). La table est quand même un objet Doctrine2 (c'est avec Doctrine que j'ai créé ma table et c'est aussi avec Doctrine que je vais piocher dedans !)

    mais je me demande si par exemple je pourrais Bypasser Doctrine uniquement pour cette fameuse table catalogue a 150 000 entrés ? Je ne sais pas si c'est possible et si oui, comment le gérer ?

  6. #6
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 772
    Par défaut
    Il suffit alors d'attaquer directement ta base avec PDO. Tant que cette table n'a aucun lien avec les autres tables liées à Doctrine, ça ne posera aucun problème (tu pourrais même déplacer cette table dans une autre base de données, pour éviter qu'un script de màj corrompu vienne foutre le bousin partout). Tu remplaces ton code Doctrine par du code PDO, en tenant bien compte des automatismes en moins (non, pas de méthode pour récupérer un bel objet, juste une requête).
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Recherche Full Text
    Par fadeninev dans le forum SQLite
    Réponses: 1
    Dernier message: 20/10/2006, 10h21
  2. [recherche FULL TEXT ]
    Par viny dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 20/09/2006, 17h08
  3. [MySQL] Recherche FULL TEXT IN BOOLEAN MODE et les Quotes
    Par GarGamel55 dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 23/01/2006, 20h01
  4. [Info]moteur de recherche full text en environnement j2ee
    Par ddams dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 03/11/2004, 19h39
  5. Recherche FULL Text existe que dans MySql ?
    Par seb.49 dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 01/06/2004, 22h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo