Pregunta

Uno realmente simple.En SQL, si quiero buscar un campo de texto con un par de caracteres, puedo hacer:

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.

¿Fue útil?

Solución

BigTable, que es el back-end de la base de datos de App Engine, escalará a millones de registros.Debido a esto, App Engine no le permitirá realizar ninguna consulta que resulte en un escaneo de la tabla, ya que el rendimiento sería terrible para una tabla bien poblada.

En otras palabras, cada consulta debe utilizar un índice.Por eso sólo puedes hacer =, > y < consultas.(De hecho también puedes hacer != pero la API hace esto usando una combinación de > y < consultas.) Esta es también la razón por la cual el entorno de desarrollo monitorea todas las consultas que usted realiza y agrega automáticamente los índices faltantes a su index.yaml archivo.

No hay manera de indexar para un LIKE consulta por lo que simplemente no está disponible.

tener un reloj de esta sesión de Google IO para una explicación mucho mejor y más detallada de esto.

Otros consejos

Estoy enfrentando el mismo problema, pero encontré algo en las páginas del motor de aplicaciones de Google:

Consejo:Los filtros de consulta no tienen una forma explícita de hacer coincidir solo una parte de un valor de cadena, pero puedes 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 hace coincidir cada entidad MyModel con una 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 se encuentran 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 funcionar;)

Aunque App Engine no admite consultas LIKE, eche un vistazo a las propiedades Lista de propiedades y Propiedad de lista de cadenas.Cuando se realiza una prueba de igualdad en estas propiedades, la prueba en realidad se aplicará a todos los miembros de la lista, por ejemplo, list_property = value prueba si el valor aparece en cualquier lugar de la lista.

A veces, esta característica puede usarse como solución alternativa a la falta de consultas LIKE.Por ejemplo, permite hacer búsqueda de texto simple, como se describe en esta publicación.

Necesitas usar servicio de búsqueda para realizar consultas de búsqueda de texto completo similares a SQL LIKE.

Gaëlyk proporciona un lenguaje específico de dominio para realizar más consultas de búsqueda fáciles de usar.Por ejemplo, el siguiente fragmento encontrará los primeros diez libros ordenados desde los últimos cuyo título contiene ferny el género coincide exactamente 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
}

Me gusta está escrito como operador de coincidencia de Groovy. =~.Admite funciones como distance(geopoint(lat, lon), location) también.

El motor de aplicaciones lanzó un propósito general servicio de búsqueda de texto completo en la versión 1.7.0 que admite el almacén de datos.

Detalles en el anuncio.

Más información sobre cómo utilizar esto: https://cloud.google.com/appengine/training/fts_intro/lesson2

Echa un vistazo a Objectify aquí , es como una API de acceso al almacén de datos.Hay una sección de preguntas frecuentes con esta pregunta específicamente, aquí está la respuesta.

¿Cómo hago una consulta Me gusta (LIKE "foo%")?
Puede hacer algo como startWith o endWith si invierte el orden al almacenar y buscar.Realiza una consulta de rango con el valor inicial que desea y un valor justo encima del que desea.

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

Sólo sigue aquí:init.py#354">http://code.google.com/p/googleappengine/source/browse/trunk/python/google/appengine/ext/search/en eso.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(...)

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

En general, aunque esta es una publicación antigua, una forma de producir un 'ME GUSTA' o 'IL COMO' es recopilar todos los resultados de una consulta '>=' y luego hacer un bucle con los resultados en Python (o Java) para los elementos que contienen lo que desea. 'que estas buscando.

Digamos que desea filtrar usuarios dado un 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)

No es posible realizar una búsqueda ME GUSTA en el motor de la aplicación del almacén de datos; sin embargo, crear una Arraylist sería suficiente 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 te dará una lista con todos los elementos que contienen el mundo que hiciste en la búsqueda

Si el LIKE '%text%' siempre se compara con una palabra o unas pocas (piense en permutaciones) y sus datos cambian lentamente (lentamente significa que no es prohibitivamente costoso, tanto en términos de precio como de rendimiento, crear y actualizar índices), entonces la Entidad de índice de relación (RIE) puede ser la respuesta.

Sí, deberá crear una entidad de almacén de datos adicional y completarla adecuadamente.Sí, existen algunas restricciones con las que tendrá que jugar (una es el límite de 5000 en la longitud de la propiedad de lista en el almacén de datos GAE).Pero las búsquedas resultantes son increíblemente rápidas.

Para más detalles ver mi RIE con Java y Ojbectify y RIE con Python publicaciones.

"Me gusta" se utiliza a menudo como sustituto de la búsqueda de texto por parte de los pobres.Para la búsqueda de texto, es posible utilizar Whoosh-AppEngine.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top