2010-07-22 3 views
4

Existe-t-il un moyen d'implémenter Django like contains ou icontains avec Google App Engine? J'utilise le correctif du moteur de l'application.Comment implémenter Django comme une requête de filtre 'contains' avec Google App Engine?

J'ai précédemment utilisé la requête ci-dessous pour faire correspondre le début d'une chaîne, mais il est maintenant nécessaire de trouver un modèle de chaîne dans Datastore. Fondamentalement, l'exigence est de mettre en œuvre une fonctionnalité de recherche avec toutes les chaînes contenant la chaîne de recherche en conséquence.

Veuillez nous suggérer.

Merci d'avance.

Répondre

4

Ce que vous devez faire est de créer une propriété de liste de chaînes avec les différentes permutations de chaînes et la requête sur cette liste.

Jetez un oeil à appengine.ext.search.SearchableModel pour un exemple d'implémentation. Vous pouvez également consulter nonrel-search.

+0

parfait, c'est ce que je cherchais. Merci Eran. –

+0

est-ce que nonrel-search fournit la fonctionnalité de filtre 'contient' hors de la boîte? Tout ce que j'ai trouvé jusqu'ici est commence avec – pyeleven

+0

nevermind, je l'ai fait moi-même – pyeleven

0

Non, une véritable recherche de sous-chaîne n'est pas vraiment possible dans la banque de données. Le mieux que vous puissiez faire serait d'ajouter un index de mots-clés et de faire la requête de type "commence par" à partir de votre question, mais même pour une entité comme "foo bar baz" vous pouvez rechercher " ba "mais pas" ar b ".

Cela ressemble à un excellent travail pour BigQuery, qui est en avant-première en ce moment avec une liste d'attente pour obtenir l'accès.

+0

BigQuery est conçu pour un traitement analytique hors ligne, pas pour la recherche de texte intégral. –

+0

merci pour votre réponse. Pouvez-vous s'il vous plaît élaborer ou fournir un exemple de code de ce que vous avez mentionné. Dans mon code actuel, "foo bar baz" apparaîtrait dans le résultat seulement quand je chercherais "foo" c'est-à-dire le début de la chaîne elle-même et ne chercherais pas "bar" ou "baz". –

+0

J'essaie aussi avec whoosh mais si j'entre un seul caractère à rechercher, cela donne un objet 'NoneType' qui n'a pas de message d'erreur 'doc_scores'. –

0

Récemment, j'ai rencontré le même problème et j'ai créé mon propre gestionnaire de modèles avec une fonction de filtre redéfinie qui comprend également __contains. Je suppose que vous utilisez Django.

class UserFeedManager(models.Manager):  
    def filter(self, *args, **kwargs): 
     keywordargs = {} 
     for (arg, val) in kwargs.items(): 
      if '__contains' in arg: 
       contains.append((arg.split('__')[0], val)) 
      else: 
       keywordargs[arg] = val 

     result = [] 
     if len(contains) > 0: 
      for entry in super(UserFeedManager, self).filter(*args, **keywordargs): 
       if all(map(lambda (attr, val): val in entry.__getattribute__(attr), 
          contains)): 
        result.append(entry) 
     else: 
      result = super(UserFeedManager, self).filter(*args, **keywordargs) 

     return result 

Essentiellement, il crée une liste d'arguments qui ont un __contains, puis va chercher le résultat tout et il filtre pour maintenir uniquement les résultats qui passent tous les critères.

0
querySet = Entity.objects.all() 
ids = [] 
for i,obj in enumerate(querySet.iterator()): 
    str_to_search =obj.name 
    if str_to_search.find('blahblah') != -1: 
     ids.append(obj.id) 
querySet = querySet.filter(id__in = ids) 
+0

Salut, bienvenue à SO. Il peut être utile d'inclure un peu d'explication dans certaines sections du code. Notez également que vous répondez à une question assez ancienne, qui peut ne plus être pertinente. –

Questions connexes