2010-09-16 9 views
2

Je travaille sur une simple fonctionnalité de recherche en texte intégral MySQL sur un site CakePHP, et j'ai remarqué que MySQL déshabille les mots courts (3 caractères ou moins) hors de la requête. Certains des éléments du site ont 3 titres de caractères, cependant, et je voudrais les inclure dans les résultats. (J'ai exclu en utilisant des appareils de recherche plus robustes comme Solr en raison de contraintes budgétaires)PHP: trouver des mots de 3 caractères dans la chaîne de requête pour augmenter la recherche en texte intégral MySQL

Je veux donc trouver des mots de 3 caractères dans la chaîne de requête, et faire une recherche rapide juste sur le champ de titre. Le moyen le plus simple que je peux penser pour faire ceci est de explode() la chaîne et parcourir le tableau résultant avec strlen() pour trouver des mots de 3 caractères. Ensuite, je vais prendre ces mots et faire une recherche LIKE sur le champ de titre, juste pour s'assurer que rien qui devrait évidemment être dans les résultats a été manqué.

Existe-t-il un moyen meilleur/plus facile d'aborder cette question?

MISE À JOUR: Oui, je connais le paramètre ft_min_word_len dans MySQL. Je ne pense pas que je veux faire ça.

Répondre

0

Je vais avec mon idée originale pour l'instant, à moins que quelqu'un a une meilleure approche ne comportant pas ft_min_word_len. (. Si je pouvais l'utiliser sur un niveau par base de données, je pourrais envisager - mais sinon il est trop loin)

J'ai une fonction comme ceci:

$query = str_replace(array(',', '.'), '', $query); 
    $terms = explode(' ', $query); 
    $short = ''; 

    foreach($terms as $term){ 
     if(strlen($term) == 3){ 
      $short .= '"'.$term.'", '; 
     } 
    } 

    if(!empty($short)){ 
     $short = trim($short, ', '); 
    } 

    return $short; 

Et puis je utilisez la chaîne renvoyée pour rechercher la colonne title: WHERE title IN ($short), pour compléter une recherche de texte intégral. J'attribue arbitrairement un score de 3,5, de sorte que les enregistrements retournés puissent être triés avec les autres résultats de recherche en texte intégral (j'ai choisi un score relativement élevé, puisqu'il correspond exactement au title de l'enregistrement).

Cela ne me semble pas très élégant, mais cela résout le problème.

+0

Vous pouvez rechercher votre base de données avec 3 caractères en utilisant ceci? – nn2

+0

Ce n'est probablement pas la meilleure façon de s'y prendre, mais cela a fonctionné pour moi. – bjudson

1

Il existe une option système nommée "ft_min_word_len" par laquelle vous pouvez définir la longueur minimale des mots à indexer. Vous pouvez définir la valeur de cette directive de configuration à une valeur inférieure (par exemple 2): elle se trouve dans la section [mysqld] de votre fichier de configuration MySQL. Ce fichier se trouve généralement sous "/ etc/mysql" ou "/ etc". Dans les fenêtres, vous pouvez regarder sous le répertoire Windows ou le dossier de base de MySQL.

[mysqld] 
ft_min_word_len=2 
+0

Merci, j'avais effectivement rencontré ce paramètre avant de poster la question (probablement aurait dû le mentionner). Je ne suis vraiment pas sûr de vouloir changer le réglage pour toutes les recherches en texte intégral, mais je ne veux pas manquer des entrées avec 3 caractères dans le titre. Je peux jouer avec cette option cependant. – bjudson