2010-07-18 8 views
3

J'ai une table de noms dans ma base de données et je voudrais faire une recherche floue à ce sujet par exemple ma base de données contient:MySQL: effectuer une recherche de base

Name   ID 
John Smith 1 
Edward Smith 2 
Gabriel Gray 3 
Paul Roberts 4 

Au moment où je recherche la base de données via Python Je ne peux faire que des recherches exactes. Mais je voudrais être capable de faire une recherche floue où je peux chercher le nom "smith" et ramener John Smith et Edward Smith.

+1

Avez-vous seulement besoin d'être insensible à la casse? Ou vous en avez vraiment besoin pour retourner des matchs pour des chaînes similaires (c.-à-d. Que la recherche de smith rapporte John Smith et Edward Smith)? – quantumSoup

+0

retourner des chaînes similaires, donc cas séssibilité requis – Jim

+1

parce que "recherche floue" signifie généralement ceci: http://en.wikipedia.org/wiki/Approximate_string_matching –

Répondre

5

En forme la plus simple, vous devriez utiliser la comparaison LIKE:

SELECT * FROM table WHERE name LIKE '%smith%'; 

recherches plus élaborées peut de fait avec index FULLTEXT (grandes quantités de texte), SOUNDEX() (fonctionne avec les mots dans la langue anglaise, correspondant sur d'autres langues est tout de «quelque peu maniable» à «terrible»), la distance levenshtein des mots, etc

+2

Pour ajouter à cela, vous pouvez utiliser la comparaison insensible à la casse dans MySQL si vous sélectionnez le classement approprié (celui qui a le suffixe _ci) – quantumSoup

+0

Merci, le plus simple identifiant ce que je cherche – Jim

0
import MySQLdb 
search_str = 'smith' 
conn = MySQLdb.connect(host="localhost", user="me",passwd="pw",db="mydb") 
c = conn.cursor() 
c.execute("SELECT name FROM mytable WHERE name LIKE %s", '%' + search_str + '%') 
c.fetchall() 
c.close() 
conn.close() 
Questions connexes