# Effizientes Query System für Wortnachschlagewerk



## Chtonian (25. Jun 2009)

Guten Tag liebe Mitglieder des Java Forums,

komme ich direkt zu meinem Problem.
Ich habe eine Datenbank (MySQL) und ein JAVA Programm, welches Wörter aus einem gegebenen Text mit Wörtern aus der Datenbank vergleichen soll.

Die Texte sind beliebig lang, und es können beliebig oft neue Texte eingegeben / analysiert werden.

Der Standardweg, den ich bis jetzt eingeschlagen habe, ist, dass ich die Wörter des Textes einzeln per Query auf Vorhandensein innerhalb der Datenbank überprüfe, mittels eines einfachen "Select count(word) from Word where word = "${wort}""

Nun habe ich jedoch das problem, dass mit steigender Programmlaufdauer die Antwort / Queryzeiten des Systems immer langsamer werden, was wahrscheinlich am Cache der Datenbank liegt.

Leider kann ich diesen Cache nicht deaktivieren, da die anderen Systeme darauf angewiesen sind.

Gibt es eine effizientere Methode, schnellere Methode um 1. zu überprüfen, ob das wort bereits in der Datenbank ist, und wenn nein, es hinzuzufügen ? (dies verbietet automatisch die verwendung einer HashMap, da ich sicherstellen muss, dass concurrent laufende Threads immer die aktuelle Datenbasis zur verfügung haben)

Vielen Dank für eventuelle Antworten und eure Zeit

Chtonian


----------



## maki (25. Jun 2009)

Lucene vielleicht?


----------



## Chtonian (25. Jun 2009)

Lucene benutze ich bereits, um die texte in word token zu trennen, gibt es da eine möglichkeit die daten aus lucene zu speichern ?


----------



## Chtonian (25. Jun 2009)

Ich verdeutliche nochmal das, was ich eigentlich tun möchte.

Ich habe Texte, die *nicht* in einer Datenbank sind. Allerdings möchte ich die *Wörter* aus den Texten *in* eine Datenbank integrieren. D.h. ich erzeuge mit Lucene einen "Wort" - Token Strom, den ich dann mithilfe UIMA_AS mit Annotations versehe. Zusätzlich möchte ich eine *Wort*-Datenbank anlegen, in der sämtliche gefundenen Wörter aufgeführt werden. Ich möchte kein Wort doppelt haben, daher muss ich vorher überprüfen, ob das wort bereits in der Datenbank erfasst ist.

Dadurch habe ich immer 2 Arbeitsschritte:

1. Überprüfe das Vorhandensein des Wortes in der Datenbank
2. Wenn ja: Nimm dieses Wort aus der Datenbank, wenn Nein: Füge Wort der Datenbank hinzu.


----------



## homer65 (25. Jun 2009)

Wie wäre es dafür einen unique index anzulegen. Dann kann man sich die Abfrage sparen und direkt den insert machen.


----------



## Chtonian (25. Jun 2009)

hmm, du meinst, in java eine exception zu erwarten, und im falle einer exception das wort aus der datenbank laden (damit ich das entsprechende wort später zur verfügung habe, mit eventuellen feature daten aus der datenbank)

wäre eine idee. vielen dank erstmal dafür!


----------



## ice-breaker (25. Jun 2009)

1. was ergibt folgendes (vor und nach dem uniquekey):

```
explain select count(word) from Word where word = "${wort}"
```

2. einer von beiden folgenden SQL-Statements (wie genannt mit einem Unique-Key):



```
INSERT IGNORE INTO ...
```



```
INSERT INTO ... ON DUPLICATE KEY UPDATE ...
```
 (falls du bei jedem Wort noch einen Zähler hast, wie oft es genutzt wird)


----------



## Chtonian (26. Jun 2009)

Vielen Dank für die Antworten, jedoch ist das grundlegende Problem die Tatsache, dass wir nicht SQL direkt verwenden können, sondern über JPA unsere Datenbank ansprechen.
Dementsprechend sind solche Querys nicht möglich.

Aktuell habe ich es so umgesetzt, dass bei einem Persist des Wort Objektes direkt ein flush ausgeführt wird, der in einem Try Catch Block liegt.

Falls ein Fehler auftritt, so überprüfe ich, ob es ein ConstraintViolationFehler ist, und bearbeite im Businesslogik Tier die Exception stillschweigend als Hinweis darauf, dass das WOrt bereits in der Datenbank vorhanden ist.

Jedoch habe ich nun das problem, dass die Exception an den Server weitergeleitet wird, und auch dort entsprechend ausgegeben wird. Dies hat zur folge, dass wir nach kurzer zeit ein riesiges Logfile mit ansich unsinnigen Exceptions (Duplicate Key) vollgemüllt haben.


----------



## faulelotte (30. Jun 2009)

Wenn du schon Lucene einsetzt, solltest du Dir vielleicht einmal Compass ansehen. Ist unter 
anderem dazu imstande Lucene Daten in eine Datenbank zu prügeln.


----------



## Chtonian (2. Jul 2009)

Danke für die Antwort, werde ich mir direkt mal zu gemüte führen


----------

