Simple vraiment. En SQL, si je veux rechercher un champ de texte pour quelques caractères, je peux faire:
SELECT blah FROM blah WHERE blah LIKE '%text%'
La documentation d'App Engine ne mentionne pas comment y parvenir, mais c'est sûrement un problème assez courant?
google-app-engine
google-cloud-datastore
gql
littlecharva
la source
la source
Réponses:
BigTable, qui est le backend de la base de données pour App Engine, évoluera jusqu'à des millions d'enregistrements. Pour cette raison, App Engine ne vous autorisera pas à effectuer des requêtes qui entraîneront une analyse de table, car les performances seraient terribles pour une table bien remplie.
En d'autres termes, chaque requête doit utiliser un index. C'est pourquoi vous ne pouvez le faire
=
,>
et les<
requêtes. (En fait, vous pouvez également le faire,!=
mais l'API le fait en utilisant une combinaison de>
et de<
requêtes.) C'est également pourquoi l'environnement de développement surveille toutes les requêtes que vous faites et ajoute automatiquement les index manquants à votreindex.yaml
fichier.Il n'y a aucun moyen d'indexer une
LIKE
requête, elle n'est donc tout simplement pas disponible.Regardez cette session Google IO pour une explication bien meilleure et plus détaillée à ce sujet.
la source
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 n'ont pas de moyen explicite de faire correspondre uniquement une partie d'une valeur de chaîne, mais vous pouvez simuler une correspondance de préfixe à l'aide de filtres d'inégalité:
Cela correspond à chaque entité MyModel avec une propriété de chaîne prop 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 cela pourrait faire l'affaire;)
la source
Si App Engine ne prend pas en charge les requêtes LIKE, jetez un œil aux propriétés ListProperty et StringListProperty . Lorsqu'un test d'égalité est effectué sur ces propriétés, le test sera effectivement appliqué à tous les membres de la liste, par exemple, il
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, il permet de faire une recherche de texte simple, comme décrit dans cet article .
la source
Vous devez utiliser le service de recherche pour effectuer des requêtes de recherche en texte intégral similaires à SQL
LIKE
.Gaelyk fournit un langage spécifique au domaine pour effectuer des requêtes de recherche plus conviviales . Par exemple, l'extrait de code suivant trouvera les dix premiers livres triés à partir des derniers avec le titre contenant
fern
et le genre correspondant exactementthriller
:Like est écrit comme l'opérateur de correspondance de Groovy
=~
. Il prend également en charge des fonctions telles quedistance(geopoint(lat, lon), location)
.la source
Le moteur d'application a lancé un service de recherche en texte intégral à usage général dans la version 1.7.0 qui prend en charge la banque de données.
Détails dans l' annonce .
Plus d'informations sur l'utilisation de ceci: https://cloud.google.com/appengine/training/fts_intro/lesson2
la source
Jetez un œil à Objectify ici , c'est comme une API d'accès au magasin de données. Il y a une FAQ avec cette question spécifiquement, voici la réponse
la source
Suivez simplement ici: init.py # 354 "> http://code.google.com/p/googleappengine/source/browse/trunk/python/google/appengine/ext/search/ init .py # 354
Ça marche!
la source
J'ai testé cela avec l'API Java de bas niveau GAE Datastore. Moi et fonctionne parfaitement
la source
En général, même s'il s'agit d'un ancien article, un moyen de produire un 'LIKE' ou 'ILIKE' est de rassembler tous les résultats d'une requête '> =', puis de boucler les résultats en python (ou Java) pour les éléments contenant ce que vous cherchez.
Supposons que vous souhaitiez filtrer les utilisateurs avec aq = 'luigi'
la source
Il n'est pas possible de faire une recherche LIKE sur le moteur d'application du magasin de données, mais la création d'un Arraylist ferait l'affaire si vous avez besoin de rechercher un mot dans une chaîne.
puis pour rechercher dans l'index en utilisant objectify.
et cela vous donnera une liste de tous les éléments qui contiennent le monde que vous avez fait lors de la recherche
la source
Si le se
LIKE '%text%'
compare toujours à un mot ou à quelques-uns (pensez aux permutations) et que vos données changent lentement (cela signifie lentement 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 Relation Index Entity (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 jouer avec certaines contraintes (l'une est la limite de 5000 sur la longueur de la propriété de liste dans la banque de données GAE). Mais les recherches qui en résultent sont rapides comme l'éclair.
Pour plus de détails, consultez mon RIE avec Java et Ojbectify et RIE avec des publications Python .
la source
"J'aime" est souvent utilisé comme un substitut du pauvre à la recherche de texte. Pour la recherche de texte, il est possible d'utiliser Whoosh-AppEngine .
la source