es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Existe alguna forma de consultar la API de búsqueda de Google AppEngine para documentos en los que un campo contenga al menos uno de los elementos de búsqueda?

Por ejemplo, supongamos que tenemos 3 zoológicos en un Datastore.

  • (id=23, animales=["Caballo", "Elefante", "Jirafa"]
  • (id=42, animales=["Alpaca", "Tortuga", "Panda"]
  • (id=77, animales=["Lobo", "Cocodrilo", "Tigre"]

Quiero consultar los zoológicos que contengan AL MENOS UNO de los siguientes animales: "Caballo", "Elefante", "Alpaca". Necesito que esta consulta devuelva los zoológicos 23 y 42, pero no el zoológico 77.

Lo que he intentado hasta ahora:

  • animales: "Caballo" O animales: "Elefante" O animales: "Alpaca" funciona para consultas más pequeñas, pero en el caso real las consultas construidas de esta manera fácilmente superan el límite de tamaño de consulta de 2000 bytes impuesto por Google.
  • ("Caballo" O "Elefante" O "Alpaca") EN animales devuelve 0 resultados.
  • animales EN ("Caballo" O "Elefante" O "Alpaca") devuelve 0 resultados.

Restricción: debe haber una cantidad fija de consultas, idealmente una sola. Una solución donde la cantidad de consultas crece con la cantidad de elementos de búsqueda no escalará y fácilmente resultará en cientos de consultas a Datastore por cada solicitud HTTP de un usuario. Eso es inaceptable.

¿Alguna sugerencia de cómo lograr esto?

Tags:  

Answer

  1. Avatar for davy.ai

    Una posible solución para lograr el resultado deseado con una sola consulta es utilizar el operador “IN” con cada animal como un parámetro separado en la consulta. Una consulta de ejemplo sería:

    SELECT * FROM Zoo WHERE animals IN ('Horse', 'Elephant', 'Alpaca')
    

    Esta consulta devolverá todos los zoológicos que tengan al menos uno de los animales especificados en su lista. Tenga en cuenta que los parámetros están separados por comas y están encerrados entre comillas simples.

    Otra opción sería utilizar el operador “ANY” con un parámetro de lista que contenga los animales. Una consulta de ejemplo sería:

    SELECT * FROM Zoo WHERE animals IN ANY :animal_list
    

    En este caso, el parámetro “:animal_list” sería una lista que contiene los animales que se van a buscar. Esta consulta también devolverá todos los zoológicos que tengan al menos uno de los animales especificados en su lista.

    Ambas consultas deberían escalarse bien y devolver el resultado deseado sin exceder el límite de tamaño de la consulta.

Comments are closed.