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

Autres composants PHP Discussion :

Zend_Search_Lucene recherche avec utf8


Sujet :

Autres composants PHP

  1. #1
    Membre émérite
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2009
    Messages
    736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Maroc

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 736
    Par défaut Zend_Search_Lucene recherche avec utf8
    Bonjour tous le monde.
    J'ai intégrer Zend_Search_Lucene dans mon projet et ça marche très bien.

    Mon problème est au niveau du recherche j'explique.

    J'ai indexer le mot "Mathématique" encodé en utf8, il est stocké dans mon index par "Mathématique".

    Je fais une recherche par "Mathématique" ça marche bien mais par "Mathematique" ça marche pas.

    Ce que je veux c'est pouvoir chercher avec "Mathématique", "Mathematique", "Mathe", "Mathé", "ématique" et "ematique"

    J'ai utilisé les jockers et fuzzy mais il me retourne une erreur me disant que je ne peux pas utilisé les 2 à la fois.

    Mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    Zend_Search_Lucene_Search_QueryParser::setDefaultEncoding("UTF-8");
    Zend_Search_Lucene_Search_Query_Wildcard::setMinPrefixLength(0);
     
    $index = Zend_Search_Lucene::open( APPLICATION_PATH . '/data/index' );
     
    $q = $this->_getParam('wath', '');
    $query = Zend_Search_Lucene_Search_QueryParser::parse('*'.$q.'*~0.8');
     
    $results = $index->find($query);
     
    foreach ($results as $value)
    {
            echo $value->branche . '<br />';
    }
    Et Merci.

  2. #2
    Membre Expert
    Avatar de 5h4rk
    Homme Profil pro
    CTO at TabMo
    Inscrit en
    Février 2011
    Messages
    813
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : CTO at TabMo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2011
    Messages : 813
    Par défaut
    Bonjour,
    Je te déconseille ce composant.
    Tu devrais regarder du côté de solR

  3. #3
    Membre émérite
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2009
    Messages
    736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Maroc

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 736
    Par défaut
    Merci pour votre raiponce.

    Je crois que les deux sont basé sur le même principe.
    Est ce qu'il va me corrigé mon problème??

  4. #4
    Membre Expert
    Avatar de 5h4rk
    Homme Profil pro
    CTO at TabMo
    Inscrit en
    Février 2011
    Messages
    813
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : CTO at TabMo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2011
    Messages : 813
    Par défaut
    Ma réponse n'a pas pour but de solutionner ton problème mais de partir sur de bonne base.

    Les deux sont basés sur lucence mais le composant Zend est a ne surtout pas utiliser.
    C est d'ailleurs l'un des seuls composant pour lequel je serai autant catégorique

  5. #5
    Membre émérite
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2009
    Messages
    736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Maroc

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 736
    Par défaut
    Je vais prendre ton point de vue en considération dans mon prochain travail.
    Merci pour toutes aides.

  6. #6
    Membre émérite
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2009
    Messages
    736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Maroc

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 736
    Par défaut
    Voila la solution que j'ai réaliser, je ne c'est pas si c'est la bonne mais elle ma corrigé le problème.

    J'ai crée un Analyzer qui me supprime tous les accents et rond la chaine en miniscule.
    Je l'ai crée a partir de Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
     
    class Application_Analyzer_Accent extends Zend_Search_Lucene_Analysis_Analyzer_Common
    {
        /**
         * Current char position in an UTF-8 stream
         *
         * @var integer
         */
        private $_position;
     
        /**
         * Current binary position in an UTF-8 stream
         *
         * @var integer
         */
        private $_bytePosition;
     
        /**
         * Object constructor
         *
         * @throws Zend_Search_Lucene_Exception
         */
        public function __construct()
        {
            if (@preg_match('/\pL/u', 'a') != 1) {
                // PCRE unicode support is turned off
                require_once 'Zend/Search/Lucene/Exception.php';
                throw new Zend_Search_Lucene_Exception('Utf8 analyzer needs PCRE unicode support to be enabled.');
            }
        }
     
        /**
         * Reset token stream
         */
        public function reset()
        {
            $this->_position     = 0;
            $this->_bytePosition = 0;
     
            // convert input into UTF-8
            if (strcasecmp($this->_encoding, 'utf8' ) != 0  &&
                strcasecmp($this->_encoding, 'utf-8') != 0 ) {
                    $this->_input = iconv($this->_encoding, 'UTF-8', $this->_input);
                    $this->_encoding = 'UTF-8';
            }
        }
     
        /**
         * Tokenization stream API
         * Get next token
         * Returns null at the end of stream
         *
         * @return Zend_Search_Lucene_Analysis_Token|null
         */
        public function nextToken()
        {
            if ($this->_input === null) {
                return null;
            }
     
            //$match = $this->deleteAccent($match);
            $this->_input = $this->deleteAccent($this->_input);
            $this->_input = strtolower($this->_input);
     
            do {
                if (! preg_match('/[\p{L}]+/u', $this->_input, $match, PREG_OFFSET_CAPTURE, $this->_bytePosition)) {
                    // It covers both cases a) there are no matches (preg_match(...) === 0)
                    // b) error occured (preg_match(...) === FALSE)
                    return null;
                }
     
                // matched string
                $matchedWord = $match[0][0];
     
                // binary position of the matched word in the input stream
                $binStartPos = $match[0][1];
     
                // character position of the matched word in the input stream
                $startPos = $this->_position +
                            iconv_strlen(substr($this->_input,
                                                $this->_bytePosition,
                                                $binStartPos - $this->_bytePosition),
                                         'UTF-8');
                // character postion of the end of matched word in the input stream
                $endPos = $startPos + iconv_strlen($matchedWord, 'UTF-8');
     
                $this->_bytePosition = $binStartPos + strlen($matchedWord);
                $this->_position     = $endPos;
     
                $token = $this->normalize(new Zend_Search_Lucene_Analysis_Token($matchedWord, $startPos, $endPos));
            } while ($token === null); // try again if token is skipped
    		//print_r($token);
            return $token;
        }
     
        private function deleteAccent($str)
        {
    		return iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $str);
        }
    }
    je crois que iconv() donne des résultat différent sur chaque OS.
    Mon exemple est exécuté sous Linux.

    L'action qui crée les index
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    setlocale(LC_CTYPE, 'fr_FR.utf8');
     
    Zend_Search_Lucene_Analysis_Analyzer::setDefault(new Application_Analyzer_Accent());
     
    if (is_file(APPLICATION_PATH . '/data/index')) 
    { 
    	$index = Zend_Search_Lucene::open(APPLICATION_PATH . '/data/index');  
    } 
    else 
    { 
    	$index = Zend_Search_Lucene::create(APPLICATION_PATH . '/data/index');      
    } 
     
    $Branches = new Application_Model_Branches(array('ecoleId' => $this->ecole_id));
    $results = $Branches->fetchAll();   
     
    foreach ($results as $result) 
    {
    	$doc = new Zend_Search_Lucene_Document();
     
    	$doc->addField(Zend_Search_Lucene_Field::Text('branche', $result->branche, 'utf-8'));
     
    	$doc->addField(Zend_Search_Lucene_Field::Text('ar_branche', $result->arBranche, 'utf-8'));
     
    	$index->addDocument($doc); 
    }
     
    $index->commit(); 
    $index->optimize();
    L'action de recherche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    setlocale(LC_CTYPE, 'fr_FR.utf8');
    Zend_Search_Lucene_Search_Query_Wildcard::setMinPrefixLength(0);
     
    Zend_Search_Lucene_Analysis_Analyzer::setDefault(new Application_Analyzer_Accent());
     
    $index = Zend_Search_Lucene::open( APPLICATION_PATH . '/data/index' );
     
    $q = $this->_getParam('wath', '');
    $results = $index->find('*"'.$q.'"*');
     
    foreach ($results as $value)
    {
    	echo $value->branche . '<br />';
    }

  7. #7
    Membre Expert
    Avatar de 5h4rk
    Homme Profil pro
    CTO at TabMo
    Inscrit en
    Février 2011
    Messages
    813
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : CTO at TabMo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2011
    Messages : 813
    Par défaut
    Bon je vois que tu ne suis pas mes conseilles.

    J'espère donc que ce n'est pas un gros projet.

  8. #8
    Membre émérite
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2009
    Messages
    736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Maroc

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 736
    Par défaut
    Je me suis lancé dans la lecture des tuto sur solr.
    Si t'a des bon piste peu tu me les confié.

Discussions similaires

  1. Problème nom en utf8 dans la base, recherche avec like
    Par mokadjo dans le forum Requêtes
    Réponses: 3
    Dernier message: 20/08/2009, 22h42
  2. Recherche avec Zend_search_Lucene
    Par Neilime05 dans le forum Autres composants
    Réponses: 1
    Dernier message: 29/06/2009, 13h57
  3. Recherche avec Zend_Search_Lucene
    Par Nessma dans le forum Zend Framework
    Réponses: 3
    Dernier message: 11/01/2008, 13h19
  4. recherche avec findnearest
    Par souad26 dans le forum Bases de données
    Réponses: 2
    Dernier message: 18/11/2004, 20h58
  5. Enlever la surbrillance lors d'une recherche avec vi
    Par sekiryou dans le forum Applications et environnements graphiques
    Réponses: 8
    Dernier message: 04/03/2004, 13h55

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