Question

J'utilise Google App Engine (Java) avec JDO. Comment puis-je faire l'équivalent de JDO

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

La seule recommandation que je l'ai vu jusqu'à présent d'utiliser Lucene. Je suis un peu surpris que quelque chose de cette base est impossible sur hors-the-box GAE.

Était-ce utile?

La solution

Vous ne pouvez pas faire des recherches de substring ce genre sur App Engine. La raison est que le App Engine est conçu pour être évolutif et refuse d'exécuter une requête ne peut pas satisfaire avec un indice. L'indexation d'une requête comme ceci est presque impossible, car il nécessite la recherche de la totalité de la propriété « champ » de chaque enregistrement pour un match. Toute base de données relationnelle vous exécutez cette requête sur l'exécutera en faisant une analyse complète de la table et vérifier chaque enregistrement individuellement -. Unscalable, pour le moins

La solution, comme vous avez déjà découvert, est d'utiliser l'indexation en texte intégral, comme Lucene. Il existe des bibliothèques pour l'exécution Lucene sur App Engine, tels que GAELucene . Cela vous donne également la puissance de recherche appropriée texte intégral, plutôt que l'appariement naïf de sous-chaîne.

Autres conseils

.

tl; dr : Gérer votre propriété de recherche à plusieurs valeurs et d'effectuer des requêtes sur elle équivaut à

Détails: Pour ceux qui recherchent quelque chose de simple et de bricolage, vous pouvez faire ce qui suit:

  1. Sur votre entité, créer une propriété searchTerms à plusieurs valeurs. Il contiendra éléments de recherche de l'entité.

  2. Fractionner la recherche de texte de votre entité en mots. Ces mots seront uniquement consultables parties de l'entité. Vous pourriez commencer par le fractionnement sur les espaces, ou vous pouvez ajouter un peu de base issue. Par exemple. lorsqu'ils traitent avec des adresses de courriel que vous pouvez mettre les pièces utilisateur et domaine séparément afin que les deux peuvent être recherchés. Si vous votre entité est mise à jour vous devez reconstruire cette propriété.

  3. Pour effectuer une recherche, diviser l'entrée de recherche en mots (exécution découlant si nécessaire de base), et ajouter chacun comme un filtre en utilisant l'opérateur égal contre la propriété searchTerms.

    (l'opérateur = sur une propriété à valeurs multiples demande si une valeur est égal au filtre.)

    par exemple, (En utilisant Objectify ):

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top