2010-02-12 5 views
18

J'ai besoin de mettre en œuvre la recherche en texte intégral pour mon application Django, en exécutant MySQL comme backend.Django MySQL recherche plein texte

Disons que j'ai un modèle comme suit:

class MyItem(models.Model): 
    title = models.CharField() 
    short_description = models.TextField() 
    description = models.TextField() 

Je voudrais avoir des résultats d'abord pour la recherche en terme occurences titre, puis dans short_description et à la fin dans le champ de description. Je serai plus heureux si je n'ai pas besoin d'utiliser des modules/applications supplémentaires pour cette tâche.

Répondre

5

Si vous êtes à la recherche d'une solution costaud Je recommande http://haystacksearch.org/

Il est très bien pensé.

+0

Je suppose que je vais finir avec une solution tierce que j'ai essayé d'éviter. – edkirin

+0

Oui, vous pourriez avoir besoin de clarifier pourquoi c'est la solution que vous voulez? Cette option vous permet de rester indépendant de la base de données et elle évolue bien lorsque vous ajoutez des modèles db aux critères de recherche. Par exemple, sur un projet, j'ai commencé à utiliser la haystack pour une table, mais le produit final en demandait dix. N'oubliez pas cependant Si vous savez exactement ce que vous voulez en termes de SQL brut, vous pouvez l'utiliser. http://docs.djangoproject.com/fr/dev/topics/db/sql/. Bonne chance – michael

23

Vous pouvez utiliser la recherche en texte intégral dans django

MyItem.objects.filter(title__search="some search text") 

Une chose est - vous ne pouvez pas définir un index texte intégral à partir d'un modèle Django, vous devez faire directement dans une base de données (en utilisant PHPMyAdmin ou SQL requête)

Voir la documentation Django pour la recherche sur le terrain appelé search

+3

Donc, il n'y a aucun moyen de le faire sur plusieurs colonnes, non? –

+0

Cela ne fonctionne pas par défaut lors de l'utilisation de MySQL car il n'utilise pas le type de table MyISAM. Vous obtenez l'erreur "Le type de table utilisé ne prend pas en charge les index FULLTEXT" – Timmmm

+0

@SilverLight comment le faire contre plusieurs colonnes comme pour l'index de recherche FULLTEXT' composé? –

4

Je ne sais pas si ça aide maintenant, mais je l'ai créé une nouvelle bibliothèque Python pour Django qui prend en charge MySQLs' et MariaDBs de texte intégral natif moteur de recherche sur une ou plusieurs colonnes:

Vous pouvez avoir un coup d'oeil sur le GitHub repository

Il y a aussi une description comment l'installer, l'utiliser et comment créer les choses FULLTEXT INDEX par les migrations Django (Django 1.7+).

Si vous avez configuré les index et définissez la SearchManager pour votre modèle, vous devriez être en mesure d'exécuter quelque chose comme:

Mymodel.objects.search('Something') 
Mymodel.objects.search('Somet*') 
Mymodel.objects.search('+Something -Awesome') 

Je voulais juste mettre à jour ce sujet parce que je n'ai pas trouvé une solution acceptable si loin et il pourrait aider quelqu'un là aussi :)

Vive Domi

0

De django docs concernant la recherche en texte intégral:

Exemple:

Entry.objects.filter(headline__search="+Django -jazz Python")

équivalent SQL:

SELECT ... WHERE MATCH(tablename, headline) AGAINST (+Django -jazz Python IN BOOLEAN MODE);

RemarqueCet est seulement disponible en MySQL et nécessite manipulation directe de la base de données pour ajouter le texte intégral indice. Par défaut, Django utilise BOOLEAN MODE pour les recherches en texte intégral. Voir le MySQL documentation pour plus de détails.

Maintenant à la manipulation directe de la base de données. Dans MySQL, vous pouvez créer un index en texte intégral en suivant ces étapes (source article):

  • invite de commande Ouvrir, puis entrez mysql -u root -p. Au prompt, entrez le mot de passe root. Entrez le use your_db_name pour basculer vers votre base de données django.
  • Entrez CREATE FULLTEXT INDEX index_name ON table_name (column_names).

C'est tout! L'indexation FTS est activée dans votre base de données django. Vous pouvez maintenant utiliser le QuerySet API riche du django pour effectuer des recherches en texte intégral.