2008-08-17 17 views
5

J'ai essayé de trouver un moyen facile d'analyser une requête de recherche et de la convertir en une requête SQL pour ma base de données.Analyse des requêtes de recherche en Java

J'ai trouvé deux solutions:

  1. Lucene: moteur de recherche basé sur Java puissant, contient un analyseur de requête, mais il est pas très configurable et je pouvais trouver un moyen de pirater facilement/l'adapter pour créer des requêtes SQL.
  2. ANTLR: Un vétéran texte lexer-parser. Utilisé pour construire n'importe quoi des compilateurs aux grattoirs de ciel. ANTLR est hautement configurable mais tout le monde touchant le code à partir de maintenant devra apprendre une nouvelle langue ...

D'autres idées?

Répondre

0

Cela dépend beaucoup du type de requêtes que vous avez à analyser et de la structure des données dans votre base de données. Je vais supposer que vous n'essayez pas d'effectuer une recherche en texte intégral dans une base de données (c'est-à-dire un moteur de recherche sur l'ensemble de votre base de données), car la plupart des personnes chargées de la recherche d'informations vous le diront. Les index inversés sont certainement le meilleur moyen de le faire. Parlez-nous un peu plus du problème réel: que vont faire les utilisateurs, qu'est-ce qu'ils attendent en sortie et à quoi ressemble le modèle de données. Concevez une solution de recherche sans ces informations, et vous obtiendrez un résultat loin d'être optimal.

1

Qu'avez-vous exactement en tête? J'ai utilisé Lucene pour la recherche de texte, mais où il excelle est la construction d'un index et la recherche que à la place de frapper la base de données du tout.

J'ai récemment mis en place un système où j'indexer une table dans Lucene en concaténant toutes les colonnes (séparées par des espaces) en un seul champ, puis en insérant Lucene dans la colonne, puis en ajoutant la clé primaire. Lucene fait toute la recherche et a retourné une liste de clés primaires, que j'ai utilisé pour obtenir un ensemble de résultats et afficher à l'utilisateur.

La conversion d'une requête de recherche en une instruction SQL me semble un peu compliquée. En outre, voici .

0

Vous avez raison de supposer que je ne cherche pas la recherche de texte intégral. L'information ressemble à ce schéma pour l'information du livre: Nom: chaîne, éditeur: string, num_pages int, publish_date: Date ...

Les requêtes de recherche sont de la sorte:

  1. Harry Potter (recherche des livres whos nom a à la fois Harry Potter et)
  2. Editeur: Nature * pages> 100 (livres d'un éditeur en commençant par la nature avec plus de 100 livres)
  3. ("New Years" ou Noël) et présente (vous obtenez l'image ...)
  4. physique et publier> 1/1/2008 (nouveaux livres de physique)
1

Vous pouvez essayer d'utiliser quelque chose comme javacc (compilateur Java compilateur) pour mettre en œuvre un analyseur ou bien simplement analyser manuellement la chaîne par Force brute. Chaque fois que vous rencontrez une expression, vous la représentez comme un objet. Il suffit ensuite de traduire votre arbre d'expression en une clause where.

Par exemple: "Harry Potter" devient

new AndExp(new FieldContainsExp("NAME", "Harry"), new FieldContainsExp("NAME", "Potter") 

Et "Editeur: Nature * pages> 100" devient

new AndExp(new FieldContainsExp("PUBLISHER", "Nature"), FieldGreaterThan("PAGES", 100)) 

Ensuite, une fois que vous avez, il est assez facile de les tourner en SQL:

FieldContainsExp.toSQL(StringBuffer sql, Collection<Object> args) { 
    sql.append(fieldName); 
    sql.append(" like "); 
    sql.append("'%?%'"); 
    args.add(value); 
} 

AndExp.toSQL(StringBuffer sql, Collection<Object> args) { 
    exp1.toSQL(sql, args); 
    sql.append(" AND "); 
    exp2.toSQL(sql, args); 
} 

Vous pouvez imaginer le reste. Vous pouvez imbriquer Et les expressions aussi profondément que vous le souhaitez.

3

SQL-ORM est une bibliothèque Java très légère qui inclut la possibilité de construire une (dynamique) requête SQL en Java sous forme de graphique d'objets

à mon humble avis, c'est une technique beaucoup mieux pour la construction des requêtes SQL dynamiques que l'habituel Méthode de concaténation de chaînes.

Disclaimer: Je l'ai fait quelques très contributions mineures à ce projet

+0

Très intéressant. On dirait IBatis sans les trucs XML et de cartographie –

0

Essayez de combiner un outil ORM (comme OpenJPA) et Compass (cadre pour OSEM). Il indexe automatiquement les mises à jour effectuées via les outils ORM et vous donne le pouvoir Lucene pour la recherche. Après cela, vous pouvez bien sûr récupérer l'objet de la base de données. Il surpasse toute solution de recherche SQL.

-2

Chaîne [] tableau;

int checkWord(String searchWord) 
{ 
    for(int i = 0; i < array.length; i++) 
    { 
     if(searchWord.equals(array[i])) 
      return i; 
    } 
    return 0; 

} 
+0

Cela ne répond pas vraiment à la question. –