Question

Simple vraiment.En SQL, si je souhaite rechercher quelques caractères dans un champ de texte, je peux faire :

SELECT blah FROM blah WHERE blah LIKE '%text%'

La documentation d'App Engine ne mentionne pas comment y parvenir, mais il s'agit sûrement d'un problème assez courant ?

Était-ce utile?

La solution

BigTable, qui est la base de données principale d'App Engine, s'adaptera à des millions d'enregistrements.Pour cette raison, App Engine ne vous permettra pas d'effectuer de requêtes entraînant une analyse de table, car les performances seraient épouvantables pour une table bien remplie.

En d'autres termes, chaque requête doit utiliser un index.C'est pourquoi tu ne peux faire que =, > et < requêtes.(En fait, vous pouvez aussi faire != mais l'API fait cela en utilisant une combinaison de > et < requêtes.) C'est également pourquoi l'environnement de développement surveille toutes les requêtes que vous effectuez et ajoute automatiquement tous les index manquants à votre index.yaml déposer.

Il n'existe aucun moyen d'indexer un LIKE requête donc elle n'est tout simplement pas disponible.

Ayez une montre de cette session Google IO pour une explication bien meilleure et plus détaillée à ce sujet.

Autres conseils

je suis confronté au même problème, mais j'ai trouvé quelque chose sur les pages du moteur d'application Google :

Conseil:Les filtres de requête ne permettent pas de faire correspondre explicitement une partie d'une valeur de chaîne, mais vous pouvez simuler une correspondance de préfixe à l'aide de filtres d'inégalité :

db.GqlQuery("SELECT * FROM MyModel WHERE prop >= :1 AND prop < :2",
            "abc",
            u"abc" + u"\ufffd")

Cela correspond à chaque entité MyModel avec un accessoire de propriété de chaîne qui commence par les caractères abc.La chaîne Unicode u"\ufffd" représente le plus grand caractère Unicode possible.Lorsque les valeurs de propriété sont triées dans un index, les valeurs comprises dans cette plage sont toutes les valeurs commençant par le préfixe donné.

http://code.google.com/appengine/docs/python/datastore/queriesandindexes.html

peut-être que ça pourrait faire l'affaire ;)

Bien qu'App Engine ne prenne pas en charge les requêtes LIKE, jetez un œil aux propriétés PropriétéListe et PropriétéListeChaîne.Lorsqu'un test d'égalité est effectué sur ces propriétés, le test sera en fait appliqué à tous les membres de la liste, par exemple : list_property = value teste si la valeur apparaît n’importe où dans la liste.

Parfois, cette fonctionnalité peut être utilisée comme solution de contournement au manque de requêtes LIKE.Par exemple, cela permet de faire recherche de texte simple, comme décrit dans cet article.

Vous devez utiliser service de recherche pour effectuer des requêtes de recherche en texte intégral similaires à SQL LIKE.

Gaélyk fournit un langage spécifique au domaine pour effectuer plus requêtes de recherche conviviales.Par exemple, l'extrait suivant trouvera les dix premiers livres triés parmi les derniers dont le titre contient fernet le genre correspond exactement thriller:

def documents = search.search {
    select all from books
    sort desc by published, SearchApiLimits.MINIMUM_DATE_VALUE
    where title =~ 'fern'
    and genre =  'thriller'
    limit 10
}

Like est écrit comme l'opérateur de correspondance de Groovy =~.Il prend en charge des fonctions telles que distance(geopoint(lat, lon), location) aussi.

Le moteur d'application a lancé un outil à usage général service de recherche en texte intégral dans la version 1.7.0 qui prend en charge la banque de données.

Détails dans le annonce.

Plus d'informations sur la façon de l'utiliser : https://cloud.google.com/appengine/training/fts_intro/lesson2

Jetez un oeil à Objectify ici , c'est comme une API d'accès au Datastore.Il existe une FAQ avec cette question spécifiquement, voici la réponse

Comment faire une requête similaire (LIKE "foo%")
Vous pouvez faire quelque chose comme un startWith ou un endWith si vous inversez l'ordre lors du stockage et de la recherche.Vous effectuez une requête de plage avec la valeur de départ souhaitée et une valeur juste au-dessus de celle souhaitée.

String start = "foo";
    ... = ofy.query(MyEntity.class).filter("field >=", start).filter("field <", start + "\uFFFD");

Suivez simplement ici :init.py#354">http://code.google.com/p/googleappengine/source/browse/trunk/python/google/appengine/ext/search/initialisation.py#354

Ça marche!

class Article(search.SearchableModel):
    text = db.TextProperty()
    ...

  article = Article(text=...)
  article.save()

To search the full text index, use the SearchableModel.all() method to get an
instance of SearchableModel.Query, which subclasses db.Query. Use its search()
method to provide a search query, in addition to any other filters or sort
orders, e.g.:

  query = article.all().search('a search query').filter(...).order(...)

J'ai testé cela avec l'API Java de bas niveau de GAE Datastore.Moi et fonctionne parfaitement

    Query q = new Query(Directorio.class.getSimpleName());

    Filter filterNombreGreater = new FilterPredicate("nombre", FilterOperator.GREATER_THAN_OR_EQUAL, query);
    Filter filterNombreLess = new FilterPredicate("nombre", FilterOperator.LESS_THAN, query+"\uFFFD");
    Filter filterNombre =  CompositeFilterOperator.and(filterNombreGreater, filterNombreLess);

    q.setFilter(filter);

En général, même s'il s'agit d'un article ancien, une façon de produire un « LIKE » ou « ILIKE » consiste à rassembler tous les résultats d'une requête « >= », puis à boucler les résultats en python (ou Java) pour les éléments contenant ce que vous tu cherches.

Disons que vous souhaitez filtrer les utilisateurs avec q='luigi'

users = []
qry = self.user_model.query(ndb.OR(self.user_model.name >= q.lower(),self.user_model.email >= q.lower(),self.user_model.username >= q.lower()))

for _qry in qry:
 if q.lower() in _qry.name.lower() or q.lower() in _qry.email.lower() or q.lower() in _qry.username.lower():
      users.append(_qry)

Il n'est pas possible d'effectuer une recherche LIKE sur le moteur de l'application de la banque de données, mais la création d'une Arraylist ferait l'affaire si vous devez rechercher un mot dans une chaîne.

@Index
    public ArrayList<String> searchName;

puis rechercher dans l'index en utilisant objectivey.

List<Profiles> list1 = ofy().load().type(Profiles.class).filter("searchName =",search).list();

et cela vous donnera une liste de tous les éléments contenant le monde que vous avez recherché lors de la recherche.

Si la LIKE '%text%' se compare toujours à un mot ou à quelques-uns (pensez aux permutations) et vos données changent lentement (lentement signifie qu'il n'est pas prohibitif - à la fois en termes de prix et de performances - de créer et de mettre à jour des index), alors l'entité d'index relationnel (RIE) peut être la réponse.

Oui, vous devrez créer une entité de banque de données supplémentaire et la remplir de manière appropriée.Oui, vous devrez contourner certaines contraintes (l'une d'elles est la limite de 5 000 sur la longueur de la propriété de liste dans la banque de données GAE).Mais les recherches qui en résultent sont ultra-rapides.

Pour plus de détails, consultez mon RIE avec Java et Ojbectify et RIE avec Python des postes.

"J'aime" est souvent utilisé comme substitut du pauvre à la recherche de texte.Pour la recherche de texte, il est possible d'utiliser Whoosh-AppEngine.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top