2010-10-03 5 views
0

J'essaie de créer une fonctionnalité de recherche de base pour MySQL InnoDB. Je sais qu'il y a une recherche en texte intégral, mais je veux juste faire une solution simple et facile pour l'instant. Ce que je veux, c'est que lorsqu'un utilisateur recherche par exemple "BMW Car" je veux trouver des résultats non seulement comme "BMW Car" mais aussi "Car BMW" "BMW Z4 Car" et ainsi de suite .. Y at-il un moyen facile de faire ce? Comment mettriez-vous en œuvre une recherche comme celle-ci?Recherche simple dans MySql

En ce moment je suis en utilisant LIKE:

SELECT title,id FROM table WHERE title LIKE '%BMW Car%' 

Mais cela ne me donne pas des résultats comme "Voiture BMW" "BMW Z4 voitures" ..

Répondre

0

Jetez un oeil aux opérateurs logiques MySQL: http://dev.mysql.com/doc/refman/5.1/en/logical-operators.html

# Title must contain either "bmw" or "car" 
SELECT title, id FROM table WHERE title LIKE '%bmw%' OR title LIKE '%car%' 

#Title must contain both "bmw" and "car" 
SELECT title, id FROM table WHERE title LIKE '%bmw%' AND title LIKE '%car%' 
1

Vous pouvez travailler avec deux goûts:

SELECT title,id FROM table WHERE title LIKE '%BMW%' AND title LIKE '%Car%' 

S'il n'y avait pas besoin de changer la configuration du serveur à reduce the minimum key word size de 4 à 3 pour correspondre à BMW, je dirais que vous seriez mieux avec full-text search en boolean mode depuis le début. Il est tellement plus souple:

SELECT title,id FROM table WHERE MATCH (title) 
AGAINST ('+BMW +Car -Volvo' IN BOOLEAN MODE); 

recherche de texte intégral peut aussi rechercher des expressions:

SELECT title,id FROM table WHERE MATCH (title) 
AGAINST ('+"BMW Z4" -"BMW Z3"' IN BOOLEAN MODE); 
+0

Mais la recherche plein texte n'est-elle pas MyIsam? J'utilise InnoDB .. – Martin

+0

@Martin vous avez raison bien sûr, j'ai négligé cette partie. Pardon. FWIW, [voici] (http://forums.mysql.com/read.php?22,12604,12956#msg-12956) une description de la façon dont Wikipedia semble fonctionner autour de lui (le fil entier est intéressant). LIKE semble en effet être le moyen le plus facile –

+0

Toutes les idées si InnoDB inclura la recherche plein texte dans le futur? J'aime vraiment la simplicité du code en texte intégral ci-dessus! – Martin

0

Cela prendra un certain pré-traitement pour diviser l'entrée d'utilisateur en mots. En php, vous pouvez faire:

$sql = "SELECT title,id FROM table WHERE " ; 
$or = "" ; 
$inputs = explode(" ", $_GET['q']) ; 
foreach($inputs as $input) { 
    if(trim($input)=="") continue ; 
    $sql .= $or."title LIKE '%".sprintf("%s", mysql_real_escape_string($input))."%' " ; 
    $or = "OR " ; 
} 
$result = mysql_query($sql) ; 
0

Vous devriez chercher à utiliser Lucene pour la fonctionnalité de recherche comme ceci. Son existence entière tourne autour de la recherche de documents. Vous obtiendrez un ID de document (qui représenterait vos tableaux PK), puis sélectionnez hors de la base de données en utilisant cela.