google-app-engine - queries - python datastore order by
Google App Engine: ¿es posible hacer una consulta Gql LIKE? (12)
Simple, realmente. En SQL, si quiero buscar un campo de texto para un par de caracteres, puedo:
SELECT blah FROM blah WHERE blah LIKE ''%text%''
La documentación de App Engine no menciona cómo lograr esto, pero seguramente es un problema bastante común.
"Me gusta" a menudo se usa como sustituto de un hombre pobre para la búsqueda de texto. Para la búsqueda de texto, es posible utilizar Whoosh-AppEngine .
Aunque App Engine no admite consultas LIKE, eche un vistazo a las propiedades ListProperty y StringListProperty . Cuando se realiza una prueba de igualdad en estas propiedades, la prueba se aplicará realmente a todos los miembros de la lista, por ejemplo, list_property = value
test si el valor aparece en list_property = value
lugar de la lista.
A veces, esta característica se puede utilizar como una solución a la falta de consultas LIKE. Por ejemplo, hace posible hacer una búsqueda de texto simple, como se describe en esta publicación .
BigTable, que es el back-end de la base de datos para App Engine, se escalará a millones de registros. Debido a esto, App Engine no te permitirá realizar ninguna consulta que genere un escaneo de tabla, ya que el rendimiento sería espantoso para una tabla bien poblada.
En otras palabras, cada consulta debe usar un índice. Esta es la razón por la que solo puede hacer =
, >
y <
consultas. (De hecho, también puede hacer !=
Pero la API hace esto usando una combinación de >
y <
consultas). Esta también es la razón por la cual el entorno de desarrollo monitorea todas las consultas que hace y automáticamente agrega los índices faltantes a su archivo index.yaml
.
No hay forma de indexar para una consulta LIKE
por lo que simplemente no está disponible.
Eche un vistazo a esta sesión de Google IO para obtener una explicación mucho mejor y más detallada de esto.
Eche un vistazo a Objectify here , es como una API de acceso a Datastore. Hay una pregunta frecuente con esta pregunta específicamente, aquí está la respuesta
¿Cómo hago una consulta similar (LIKE "foo%")
Puede hacer algo como un inicio con o fin con si invierte el orden cuando se almacena y se busca. Hace una consulta de rango con el valor de inicio que desea, y un valor justo por encima del que desea.
String start = "foo";
... = ofy.query(MyEntity.class).filter("field >=", start).filter("field <", start + "/uFFFD");
El motor de la aplicación lanzó un servicio de búsqueda de texto completo de propósito general en la versión 1.7.0 que admite el almacén de datos.
Detalles en el announcement .
Más información sobre cómo usar esto: https://cloud.google.com/appengine/training/fts_intro/lesson2
En general, aunque esta es una publicación anterior, una forma de producir un ''LIKE'' o ''ILIKE'' es reunir todos los resultados de una consulta ''> ='', luego el bucle da como resultado python (o Java) para elementos que contienen lo que usted ''que estas buscando.
Supongamos que quiere filtrar los usuarios que recibieron 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)
Estoy enfrentando el mismo problema, pero encontré algo en las páginas del motor de la aplicación de Google:
Sugerencia: los filtros de consulta no tienen una forma explícita de hacer coincidir solo una parte de un valor de cadena, pero puede simular una coincidencia de prefijo usando filtros de desigualdad:
db.GqlQuery("SELECT * FROM MyModel WHERE prop >= :1 AND prop < :2",
"abc",
u"abc" + u"/ufffd")
Esto coincide con cada entidad de MyModel con un elemento de propiedad de cadena que comienza con los caracteres abc. La cadena unicode u "/ ufffd" representa el carácter Unicode más grande posible. Cuando los valores de las propiedades se ordenan en un índice, los valores que caen en este rango son todos los valores que comienzan con el prefijo dado.
http://code.google.com/appengine/docs/python/datastore/queriesandindexes.html
tal vez esto podría hacer el truco;)
Necesita usar el servicio de búsqueda para realizar consultas de búsqueda de texto completo similares a SQL LIKE
.
Gaelyk proporciona un lenguaje específico de dominio para realizar consultas de búsqueda más fáciles de usar . Por ejemplo, en el siguiente fragmento encontrarán los primeros diez libros ordenados de los más recientes con el título que contiene fern
y el género que coincide exactamente con el 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á escrito como el operador de coincidencias de Groovy =~
. Admite también funciones tales como la distance(geopoint(lat, lon), location)
.
No es posible hacer una búsqueda LIKE en el motor de la aplicación del almacén de datos, sin embargo, la creación de un Arraylist haría el truco si necesita buscar una palabra en una cadena.
@Index
public ArrayList<String> searchName;
y luego buscar en el índice usando Objectify.
List<Profiles> list1 = ofy().load().type(Profiles.class).filter("searchName =",search).list();
y esto le dará una lista con todos los elementos que contienen el mundo que usted hizo en la búsqueda
Probé esto con la API Java de bajo nivel de GAE Datastore. Yo y funciona perfectamente
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);
Si el LIKE ''%text%''
siempre se compara con una palabra o unos pocos (piense en permutaciones) y sus datos cambian lentamente (lentamente significa que no es prohibitivamente costoso, tanto en cuanto a precio como en rendimiento, crear y actualizar índices) entonces La entidad del índice de relación (RIE) puede ser la respuesta.
Sí, deberá crear una entidad de almacenamiento de datos adicional y completarla apropiadamente. Sí, hay algunas restricciones que tendrá que jugar (una es el límite de 5000 en la longitud de la propiedad de la lista en el almacén de datos de GAE). Pero las búsquedas resultantes son muy rápidas.
Para más detalles, vea mi RIE con Java y Ojbectify y RIE con publicaciones de Python .
Solo tiene que seguir aquí: init.py # 354 "> http://code.google.com/p/googleappengine/source/browse/trunk/python/google/appengine/ext/search/ init .py # 354
¡Funciona!
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(...)