Pregunta

Estoy usando Google App Engine (Java) con JDO. ¿Cómo puedo hacer el equivalente de JDO

select * from table where field like '%foo%'

La única recomendación que he visto hasta ahora es utilizar Lucene. Estoy un poco sorprendido de que algo tan básico no es posible en fuera-de-la-caja de GAE.

¿Fue útil?

Solución

No se puede hacer búsquedas de subcadenas de ese tipo en App Engine. La razón de esto es que el almacén de datos de App Engine está diseñado para ser escalable, y se niega a ejecutar cualquier consulta no se puede satisfacer con un índice. Indexar una consulta como esta es casi imposible, ya que requiere la búsqueda de la totalidad de la propiedad 'campo' de cada registro de un partido. Cualquier base de datos relacional se ejecuta esta consulta en lo ejecutará al hacer un escaneo completo de tabla y comprobar cada registro individual -. Unscalable, por decir lo menos

La solución, como ya se ha averiguado, es utilizar la indización de texto, tales como Lucene. Hay bibliotecas para ejecutar Lucene en App Engine, como GAELucene . Esto también le da el poder de búsqueda de texto completo adecuada, en lugar de coincidencia de subcadena ingenuo.

Otros consejos

.

tl; dr : Administrar su propio de varios valores de propiedades de búsqueda y realizar consultas en contra de ella es igual a

Detalles de: Para aquellos que buscan algo sencillo y bricolaje, puede hacer lo siguiente:

  1. En su entidad, crear un valor múltiple propiedad searchTerms. Este contendrá elementos de búsqueda de la entidad.

  2. Dividir texto de búsqueda de su entidad en palabras. Estas palabras serán sólo algunas partes de búsqueda de la entidad. Se podría empezar por división en el espacio en blanco, o se puede añadir un poco de derivado básico. P.ej. cuando se trata de direcciones de correo electrónico es posible que desee poner las partes de usuario y de dominio en forma separada para que ambos puedan ser registrado. Si su entidad se actualiza tendrá que reconstruir esta propiedad.

  3. Para realizar una búsqueda, divide la entrada de búsqueda en palabras (realización básica derivada si es necesario), y añadir cada uno como un filtro usando el operador contra la propiedad searchTerms es igual.

    (el operador = en una propiedad de varios valores pregunta si cualquier valor es igual a la del filtro).

    por ejemplo: (Usando Objectify ):

    Query query = dao.ofy().query(Recipe.class);
    for (String term : search.toLowerCase().split(" ")) {
      query = query.filter("searchTerms =", term);
    }
    

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