Parsen Suchanfragen in Java

stimmen
5

Ich habe versucht, eine einfache Möglichkeit zu finden, eine Suchabfrage und wandelt es in eine SQL-Abfrage für meine DB zu analysieren.

Ich habe zwei Lösungen gefunden:

  1. Lucene : Leistungsfähige Java-basierte Suchmaschine, enthält einen AbfrageParseraber es ist nicht sehr konfigurierbar und ich konnte einen Wegum leichthacken / anzupassen finde SQLAbfragen zu erstellen.
  2. ANTLR : Ein Veteran Text Lexer-Parser. Wird fürvon Compilern zu Wolkenkratzern Gebäude etwas. ANTLR isthohem Maße konfigurierbaraber jeder den Code ab sofort berührt werdeneine neue Sprache lernen ...

Jede andere Ideen?

Veröffentlicht am 17/08/2008 um 20:21
quelle vom benutzer
In anderen Sprachen...                            


7 antworten

stimmen
3

SQL-ORM ist eine sehr leichte Java - Bibliothek , die die Fähigkeit beinhaltet eine (dynamische) SQL - Abfrage in Java als Graph von Objekten zu konstruieren

IMHO ist dies eine viel bessere Technik für die Entwicklung dynamische SQL-Abfragen als die übliche String concatentation Methode.

Haftungsausschluss: Ich habe einige gemacht sehr geringfügige Beiträge zu diesem Projekt

Beantwortet am 30/09/2008 um 21:09
quelle vom benutzer

stimmen
1

Sie könnten mit so etwas wie versuchen javacc (Java Compiler Compiler) einen Parser zu implementieren oder auch nur manuell die Zeichenfolge mit brutaler Gewalt zu analysieren. Jedes Mal , wenn Sie über einen Ausdruck kommen stellen Sie es als Objekt. Dann müssen Sie nur noch Ihren Ausdrucksbaum in eine where - Klausel übersetzen.

Zum Beispiel: „Harry Potter“ wird

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

Und „Verlag: Natur * Seiten> 100“ wird

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

Dann, wenn Sie diese haben, ist es ziemlich einfach, sie in SQL zu drehen:

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

Sie können den Rest vorstellen. Sie können Nest und Ausdrücke so tief wie Sie wollen.

Beantwortet am 30/09/2008 um 20:43
quelle vom benutzer

stimmen
1

Was genau haben Sie im Sinn? Ich habe Lucene für Text-Suche verwendet, aber wo es zeichnet einen Index baut und dass die Suche stattdessen die Datenbank überhaupt zu schlagen.

I vor kurzem ein System, in dem I-Index eine Tabelle in Lucene durch Verketten all Spalten (getrennt durch Leerzeichen) in ein Feld, und daß in popping Lucene und dann auch das Hinzufügen des Primärschlüssels in einer separaten Spalte aufgebaut. Lucene macht die ganze Suche und wieder eine Liste der Primärschlüssel, die ich verwendet, um eine bevölkerungs Satz von Ergebnissen zu ziehen, und dem Benutzer angezeigt werden soll.

eine Suchabfrage in eine SQL-Anweisung Umwandlung scheint mir ein wenig chaotisch zu sein.

Auch hier ist ein großer Anfang Tutorial die Grundstruktur von Lucene zu erklären .

Beantwortet am 17/08/2008 um 20:30
quelle vom benutzer

stimmen
0

Versuchen Sie, ein ORM-Tool zu kombinieren (wie OpenJPA) und Compass (Rahmen für OSEM). Es indiziert automatisch die Aktualisierungen durch die ORM-Tools durchgeführt und gibt Ihnen die Lucene Leistung für die Suche. Danach können Sie von Gängen abrufen das Objekt aus der DB. Es out-führt jede SQL-basierte Suche Lösung.

Beantwortet am 18/08/2009 um 18:50
quelle vom benutzer

stimmen
0

Sie sind richtig, anzunehmen, dass ich nicht für Volltextsuche suchen. Die Informationen sehen so etwas wie dieses Schema für Buchinfo: Name: string, Herausgeber: string, num_pages int, publish_date: Datum ...

Die Suchanfragen sind von der Sorte:

  1. Harry Potter (Suche alle Bücher whos Name Harry und Potter hat)
  2. Herausgeber: Natur * Seiten> 100 (Bücher von einem Verlag mit der Natur , beginnend mit mehr als 100 Büchern)
  3. ( „New years“ oder Weihnachten) und Gegenwart (Sie erhalten das Bild ...)
  4. Physik und veröffentlichen> 1.1.2008 (neue Physik Bücher)
Beantwortet am 17/08/2008 um 20:37
quelle vom benutzer

stimmen
0

Hängt viel von der Art von Fragen, die Sie haben zu analysieren und etwas über die Struktur der Daten in der Datenbank. Ich gehe davon aus, dass Sie nicht zur Volltextsuche in einem DB (dh eine Suchmaschine im gesamten DB) zu tun versuchen, weil, da die meisten Information Retrieval Leute werden Ihnen sagen, die Leistung für die schrecklich. Inverted-Indizes sind sicherlich der beste Weg, dies zu tun.

Bitte geben Sie uns ein bisschen mehr über das eigentliche Problem: was die Benutzer gehen zu eingegeben werden, was sie als Ausgang erwarten sind, und was ist das Datenmodell wie. Entwerfen Sie eine Suchlösung ohne diese Stücke von Informationen, und Sie werden ein bei weitem nicht optimal Ergebnis.

Beantwortet am 17/08/2008 um 20:28
quelle vom benutzer

stimmen
-2

String [] -Array;

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

}
Beantwortet am 27/09/2013 um 13:45
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more