Google App Engine: è ansible eseguire una query Gql LIKE?

Semplice davvero. In SQL, se voglio cercare un campo di testo per un paio di caratteri, posso fare:

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

La documentazione di App Engine non menziona come ottenere ciò, ma sicuramente è un problema abbastanza comune?

BigTable, che è il back-end del database per App Engine, scalerà fino a milioni di record. A causa di ciò, App Engine non ti consentirà di eseguire alcuna query che comporterà una scansione della tabella, poiché le prestazioni sarebbero terribili per una tabella ben popolata.

In altre parole, ogni query deve utilizzare un indice. Questo è il motivo per cui puoi fare solo = , > e < query. (In effetti puoi anche fare != Ma l'API lo fa usando una combinazione di > e < query.) Questo è anche il motivo per cui l'ambiente di sviluppo controlla tutte le query che fai e aggiunge automaticamente gli indici mancanti al tuo file index.yaml .

Non c'è modo di indicizzare per una query LIKE quindi semplicemente non è disponibile.

Guarda questa sessione di Google IO per una spiegazione molto migliore e più dettagliata di questo.

sto affrontando lo stesso problema, ma ho trovato qualcosa nelle pagine del motore di app di Google:

Suggerimento: i filtri di query non hanno un modo esplicito per far corrispondere solo parte di un valore di stringa, ma puoi simulare una corrispondenza di prefisso utilizzando i filtri di disuguaglianza:

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

Questo corrisponde a tutte le quadro MyModel con una proprietà di stringhe che inizia con i caratteri abc. La stringa unicode u "\ ufffd" rappresenta il più grande carattere Unicode ansible. Quando i valori della proprietà sono ordinati in un indice, i valori che rientrano in questo intervallo sono tutti i valori che iniziano con il prefisso specificato.

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

forse questo potrebbe fare il trucco;)

Anche se App Engine non supporta le query LIKE, dai un’occhiata alle proprietà ListProperty e StringListProperty . Quando viene eseguito un test di uguaglianza su queste proprietà, il test verrà effettivamente applicato a tutti i membri della lista, ad esempio, list_property = value test se il valore appare in qualsiasi punto dell’elenco.

A volte questa funzione potrebbe essere utilizzata come soluzione alternativa alla mancanza di query LIKE. Ad esempio, rende ansible fare una semplice ricerca testuale, come descritto in questo post .

È necessario utilizzare il servizio di ricerca per eseguire query di ricerca full text simili a SQL LIKE .

Gaelyk fornisce un linguaggio specifico per il dominio per eseguire query di ricerca più intuitive . Ad esempio, seguendo lo snippet troverai i primi dieci libri ordinati dagli ultimi con titolo contenente fern e il genere che corrisponde esattamente al 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 è scritto come l’operatore di corrispondenza di Groovy =~ . Supporta anche funzioni come la distance(geopoint(lat, lon), location) .

Il motore di app ha lanciato un servizio di ricerca full text di uso generale nella versione 1.7.0 che supporta il datastore.

Dettagli nell’annuncio.

Ulteriori informazioni su come utilizzare questo: https://cloud.google.com/appengine/training/fts_intro/lesson2

Dai un’occhiata a Objectify qui , è come un’API di accesso a Datastore. C’è una FAQ con questa domanda specificamente, ecco la risposta

Come faccio una query simile (LIKE “pippo%”)
Puoi fare qualcosa come startWith, o endWith se inverti l’ordine quando memorizzato e cercato. Esegui una query di intervallo con il valore iniziale desiderato e un valore appena superiore a quello desiderato.

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

Segui qui: init.py # 354 “> http://code.google.com/p/googleappengine/source/browse/trunk/python/google/appengine/ext/search/ init .py # 354

Funziona!

 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 subclasss db.Query. Use its search() method to provide a search query, in addition to any other filters or sort orders, eg: query = article.all().search('a search query').filter(...).order(...) 

Ho provato questo con l’API Java a basso livello di GAE Datastore. Io e funziona perfettamente

  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); 

In generale, anche se questo è un vecchio post, un modo per produrre un ‘LIKE’ o ‘ILIKE’ è quello di raccogliere tutti i risultati da una query ‘> =’, quindi i risultati del ciclo in python (o Java) per elementi contenenti ciò che stai cercando.

Diciamo che vuoi filtrare gli utenti dati aq = ‘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) 

Non è ansible eseguire una ricerca LIKE sul motore di app del datastore, in qualsiasi modo la creazione di un Arraylist potrebbe essere utile se si deve cercare una parola in una stringa.

 @Index public ArrayList searchName; 

e poi per cercare nell’indice usando oggettivare.

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

e questo ti darà una lista con tutti gli oggetti che contengono il mondo che hai fatto sulla ricerca

Se LIKE '%text%' si confronta sempre con una parola o pochi (pensa alle permutazioni) e i tuoi dati cambiano lentamente (lentamente significa che non è proibitivamente costoso – sia dal punto di vista dei prezzi che delle prestazioni – creare e aggiornare gli indici) quindi Relation Index Entity (RIE) potrebbe essere la risposta.

Sì, dovrai creare un’ulteriore entity framework datastore e popolarla in modo appropriato. Sì, ci sono alcuni vincoli che dovrai giocare (uno è il limite di 5000 sulla lunghezza della proprietà dell’elenco nel datastore GAE). Ma le ricerche risultanti sono velocissime.

Per i dettagli vedere la mia RIE con Java e Ojbectify e RIE con messaggi Python .

“Mi piace” è spesso usato come sostituto di un uomo povero per la ricerca di testo. Per la ricerca di testo, è ansible utilizzare Whoosh-AppEngine .