# Suchalgorithmus um Datenbank zu durchsuchen



## SeeSharpNewBee (1. Juni 2007)

Hi,

meine Frage bezieht sich auf auf eines Strings um eine Datenbank zu durchsuchen.

Bisher habe ich folgendes gemacht:

Ich habe den in die Textbox eingegebenen Wert mit eine StringTokenizer zerlegt, und auf vorzeichen wie "+" und "-" geprüft.

Nun stehe ich irgendwie an, weil ich auch gern hätte, das wenn jemand ein Wort unter Anführungszeichen stellt, das dieses Wort nicht vom StringTokenizer zerlegt wird.

Ich hätte schon versucht mit "String delim" nur bei Leerzeichen zu teilen, aber zwischen den Wörtern, wenn sie unter Anführungsstrichen stehen ist auch ein leerzeichen.

Ich würde gern wissen, wie man soetwas richtig aufbaut, zb. wie die Forensuche hier.

Kann mir jemand ein paar Codeschnippsel oder einen Link zu einer fertigen Lösung geben? Oder auch anders irgendwie helfen? Danke!


----------



## Thomas Darimont (1. Juni 2007)

Hallo,


```
/**
 * 
 */
package de.tutorials;

/**
 * @author Tom
 *
 */
public class SearchTokenSplitter {

    /**
     * @param args
     */
    public static void main(String[] args) {
        String qry ="ABC DEF \"XXX YYY\" 4711";
        
        qry = qry.replaceAll("(?<!\"[^\\s])\\s(?![^\\s]+\")", "%");
        qry = "%" + qry.replace("\"","") + "%";
        
        System.out.println(qry);
    }

}
```

Ausgabe:

```
%ABC%DEF%XXX YYY%4711%
```

Wenn du nun noch mit - Arbeiten möchtest um bestimmte Suchworte in den Ergebnissen auszuschließen musst do wohl noch einmal über den Query String drüber gehen und dann die Wörter die nicht vorkommen sollen aus der normalen Query rausnehmen und in eine Negativ-Liste legen.

Dann machst du in der Abfrage...
Negativ liste wäre als Beispiel:
-bubu -gaga

```
Select 
* 
from 
data 
where 
(content like '%ABC%DEF%XXX YYY%4711%' --exact match
or content like '%ABC%' -- partial match
or content like '%DEF%' -- partial match
or content like '%XXX YYY%' -- partial match
or content like '%4711%' ) -- partial match  
and 
(content not like '%bubu%gaga%'
or content not like '%bubu%'
or content not like '%gaga%'
)
```

Anstatt sowas selber zu bauen würde ich hier eher Lucene verwenden:
http://lucene.apache.org/java/docs/
Die haben dort fix und fertige Module für sehr ausgefeilte Textsuche in Textdateien und Datenbanken....

Gruß Tom


----------



## SeeSharpNewBee (1. Juni 2007)

Danke für die Antwort, ich würde gern deine Lesezeichenliste sehen... 

Ganz klar komme ich trotzdem noch nicht, ich habe die .jar datei jetzt heruntergeladen, und hab versucht das zu testen.

Ich hab die Doku durchgelesen, und bin auf folgendes gekommen:



> How can I use Lucene to index a database?
> 
> Connect to the database using JDBC and use an SQL "SELECT" statement to query the database. Then create one Lucene Document object per row and add it to the index. You will probably want to store the ID column so you can later access the matching items. For other (text) columns it might make more sense to only index (not store) them, as the original data is still available in your database.



OK, "use an SQL 'SELECT'", aber da kann ich das dann auch wieder selber machen und brauch Lucene nicht wirklich oder?

Oder soll ich nur die Methode "queryParser" verwenden um meinen SQL String zu bauen?

... bitte hilfe...


//EDIT:

Jetzt hab ich verstanden wie das Ding arbeiet, jedoch weiß ich immer noch nicht wie ich einen Such String bauen kann, da hab ich noch nichts gefunden.

Sobald alles fertig ist, poste ich ein komplettes Beispiel!


----------

